工作流JBPM
jbpm3 共分为12种节点 1.node节点:如果该节点没有定义ACTION,则流转到该节点时不会停留,会继续往下走,如果定义ACTION,执行完ACTION后会停在该节点上,调用 token.signal后继续流转
node节点支持事件 node-enter,node-leave
2.state 节点 调用 token.signal后继续流转,否则会停下
3.tasknode 节点 该节点中可以创建多个任务 task 一个task产生一个任务实例没定义task会自动流转 state 节点只能创建一个task
TaskMgmtInstance tmg = pi.getTaskMgmtInstance();
TaskInstance startTask = tmg.createStartTaskInstance();
任务实例生命周期 创建--开始--完成 取消--挂起
任务实例 挂起 表taskinstance issuspended = true 挂起后不能操作 查询不到
isopen = true 是否关闭 关闭后不能操作 查询不到
action 当节点往下走的时候触发当前的节点的action 如果一个节点有多个任务,调用signal 会随机进入一个tasknode 根据流程实例获取token 根据token获取node,根据node获取 levaingTranstaion, 可执行的Transtaion列表 流程节点条件判断有三种方式1.在transtation 中定义变量,2在decode中定义表达式,在hadler中返回transtation ,3 继承 JbpmVariableResolver(推荐) jbpm 自己解析流程实例变量 继承 JbpmVariableResolver 目的 不能写那么多个handler 查询单独非配给自己的私有任务列表 context.getTaskMgmtSession.findTaskInstances(actorid);
查询所属组的任务实例 context.getTaskMgmtSession.findPooledTaskInstance(actorid);
两个集合要合并 才能查看该人的所有任务 查询尚未结束的任务实例
Collection taskInstances = executionContext.getTaskMgmtInstance().getUnfinishedTasks(tonke); 会签 <task-node name = "审批" create-tasks="no" signal = "first" end-tasks="yes">
<event type="node-enter"> <action class=""> </action>
<task name="审批"> </task>
<task name="审批">
<event type = "task-end"> 在每个任务实例被结束的时候
<action class="tActionHandler">
</action>
<event>
</task>
end-tasks="yes" 有一个人审批通过后继续流转,其他人的任务都变成已完成
TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
TaskNode tasknode = (TaskNode )executionContext.getNode();
Task task = tasknode.getTasks().iterator.next();
for(){
TaskInstance ti = tmi.createTaskInstance(task,executionContext);
ti.setActorId(username); } //----------------
Conllection allTaskInstances = tmi.getTaskInstances();//获取当前流程实例下的所有任务实例 //获取当前流程实例当前Token 的未完成的任务实例
Conllection unfinishedTasks = tmi.getUnfinishedTasks(currentToken); 利用变量表达式实现自由节点,自己解释变量JbpmVariableResolver
//获取配置文件对象
JbpmConfiguration configuration = JbpmConfiguration.getInstance();
//根据配置文件对象获取jbpm上下文
JbpmContext context = configuration.createJbpmContext();
//根据上下文对象获取与jbpm表打交道的GraphSession
GraphSession graphSession = context.getGraphSession();
//根据GraphSession获取流程定义对象
ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition("sqj");
//根据流程模板创建流程实例
ProcessInstance instance = processDefinition.createProcessInstance();
//流程实例ID
System.out.println(instance.getId());
//根据流程实例获取流程实例上下文对象 ContextInstance contextInstance = instance.getContextInstance();
contextInstance.setVariable("username", "张小三");
//根据流程实例获取任务管理器
TaskMgmtInstance taskMgmtInstance = instance.getTaskMgmtInstance(); //在开始节点中创建任务setActorId设置用户,不能在handler中设置,在handler中设置不上
context.setActorId("张小三");
//SecurityHelper.getAuthenticatedActorId();
//手动进入开始任务
TaskInstance taskInstance = taskMgmtInstance.createStartTaskInstance();
//任务实例ID
System.out.println(taskInstance.getId());
//往当前任务实例中添加任务实例参数
taskInstance.setVariable("nextname", "李四");
//结束任务向下流转
//taskInstance.setActorId("张小三");
taskInstance.end("李四审批");
context.close();
UserHandler
//获取当前token
Token token = executionContext.getToken();
//根据当前token获取节点
Node node = token.getNode();
System.out.println(node.getName());
if(node.getName().equals("开始")){
String tusername = (String) executionContext.getVariable("username");
System.out.println(tusername);
assignable.setActorId(tusername);
//获取当前的流程实例
//TaskInstance taskInstance = executionContext.getTaskInstance();
//taskInstance.setActorId(tusername);
}else{
String tusername = (String) executionContext.getVariable("nextname");
System.out.println(tusername);
//获取当前的流程实例
TaskInstance taskInstance = executionContext.getTaskInstance();
taskInstance.setActorId(tusername);
assignable.setActorId(tusername);
}
public static void main(String[] args) {
//创建流程模板
ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("helloword/processdefinition.xml");
//创建流程实例
ProcessInstance processInstance = new ProcessInstance(processDefinition);
//获取一个流程实例的上下文对象
//ContextInstance contextInstance = processInstance.getContextInstance();
//上下文对象存放临时流程变量和获取同名会覆盖
//contextInstance.setTransientVariable("", "");
//contextInstance.addVariables(variables);
//根据流程实例创建开始节点的任务实例
//TaskInstance taskInstance = processInstance.getTaskMgmtInstance().createStartTaskInstance();
//向任务实例当中写入先关变量
//taskInstance.setVariable("money_count", "");
//结束任务实例流程的Token就进入下一节点
//taskInstance.end();
//流程节点
Token token = processInstance.getRootToken();
Node node = token.getNode();
//node节点不会触发
System.out.println(node.getName());
//节点向下流转一步
token.signal();
System.out.println(node.getName());
//判断是否结束
//token.getProcessInstance().hasEnded();
//单例,线程安全,配置文件对象
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
//主要作用创建jbpmContext上下文对象//发布流程到数据库
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
//从当前线程中获取上下文对象
//JbpmContext jbpmContext1 = jbpmConfiguration.getCurrentJbpmContext();
//创建数据库表 重新调用会重新创建
//jbpmConfiguration.createSchema();
//删除数据库表
//jbpmConfiguration.dropSchema();
//获取系统里的任务调度服务对象
//jbpmConfiguration.getJobExecutor();
//开始系统的任务调度服务
//jbpmConfiguration.startJobExecutor();
//jbpmContext.getTaskList();
//根据当前人ID获取任务列表
jbpmContext.getTaskList("");
//根据任务ID获取任务节点
TaskInstance instance = jbpmContext.getTaskInstance(11);
instance.end("同意");
//根据最新的流程名称获取流程模板
//ProcessDefinition lastDefinition = jbpmContext.getGraphSession().findLatestProcessDefinition("helloword");
}
//发布流程模板
String path = "E:/work/hello.zip"; JbpmContext context = JbpmConfiguration.getInstance().createJbpmContext(); InputStream inputStream = new FileInputStream(new File(path)); ZipInputStream zipInputStream = new ZipInputStream(inputStream); ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream);
context.deployProcessDefinition(processDefinition); zipInputStream.close();
inputStream.close();
context.close();
//创建JBPM数据库表
public static void createDB(){
//JbpmConfiguration configuration = JbpmConfiguration.getInstance();
JbpmConfiguration configuration = JbpmConfiguration.getInstance("hibernate.cfg.xml");
//configuration.createSchema();
} /**
* 部署流程文件
* @param path
*/
public static void depFlow(String path){
//String path = "E:/liucheng/qingjia.zip";
JbpmContext context = null;
InputStream inputStream = null;
ZipInputStream zipInputStream = null;
try {
context = JbpmConfiguration.getInstance().createJbpmContext();
inputStream = new FileInputStream(new File(path));
zipInputStream = new ZipInputStream(inputStream);
ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream);
context.deployProcessDefinition(processDefinition);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
zipInputStream.close();
inputStream.close();
context.close();
} catch (IOException e) {
e.printStackTrace();
} } } /**
* 开启流程
* @param flowName
*/
public static void startFlow(String flowName){
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
GraphSession graphSession = jbpmContext.getGraphSession();
ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition(flowName);
ProcessInstance processInstance = new ProcessInstance(processDefinition);
ContextInstance contextInstance = processInstance.getContextInstance();
contextInstance.createVariable("name", "张三");
processInstance.signal(); } public static void startFlow2(String flowName){
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
GraphSession graphSession = jbpmContext.getGraphSession();
ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition(flowName);
ProcessInstance pi = processDefinition.createProcessInstance();
TaskMgmtInstance tmg = pi.getTaskMgmtInstance();
TaskInstance startTask = tmg.createStartTaskInstance();
startTask.setVariableLocally("JitTaskVar", "");
startTask.end();
} /**
* 获取最新的所有流程模板
* @return
*/
public static List<ProcessDefinition> getAllLastProcessDefinitions(){
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
GraphSession graphSession = jbpmContext.getGraphSession();
List<ProcessDefinition> processDefinitions = graphSession.findLatestProcessDefinitions();
for (ProcessDefinition processDefinition : processDefinitions) {
System.out.println("流程ID: "+processDefinition.getId()+"流程版本: "+processDefinition.getVersion()+" 流程名称"+processDefinition.getName());
}
jbpmContext.close();
return processDefinitions;
} /**
* 获取当前人的任务列表
* @param actorId
* @return
*/
public static List<Task> getAllTask(String actorId){
JbpmConfiguration configuration = JbpmConfiguration.getInstance();
JbpmContext context = configuration.createJbpmContext();
TaskMgmtSession mgmtSession = context.getTaskMgmtSession();
List<Task> tasks = mgmtSession.findTaskInstances(actorId);
context.close();
return tasks;
} /**
* 获取所有的流程版本
* @return
*/
public static List<ProcessDefinition> getAllDefinitions(){
JbpmConfiguration configuration = JbpmConfiguration.getInstance();
JbpmContext context = configuration.createJbpmContext();
GraphSession graphSession = context.getGraphSession();
List<ProcessDefinition> definitions = graphSession.findAllProcessDefinitions();
for (ProcessDefinition processDefinition : definitions) {
System.out.println("流程ID: "+processDefinition.getId()+"流程版本: "+processDefinition.getVersion()+" 流程名称"+processDefinition.getName());
}
context.close();
return definitions;
} /**
* 获取当前流程的所有版本
* @return
*/
public static List<ProcessDefinition> getAllDefinitions(String defName){
JbpmConfiguration configuration = JbpmConfiguration.getInstance();
JbpmContext context = configuration.createJbpmContext();
GraphSession graphSession = context.getGraphSession();
List<ProcessDefinition> definitions = graphSession.findAllProcessDefinitionVersions(defName);
for (ProcessDefinition processDefinition : definitions) {
System.out.println("流程ID: "+processDefinition.getId()+"流程版本: "+processDefinition.getVersion()+" 流程名称"+processDefinition.getName());
}
context.close();
return definitions;
}
工作流JBPM的更多相关文章
- 工作流--JBPM简介及开发环境搭建
一. 工作流简介 项目中不断的接触工作流,点点滴滴积累了一些,下面把一些学习到的东西整理记录下来. 工作流一般的适用场景:公文流转.行政审批.订单处理.产品研发.制造过程等.用专业一点的语言来描述工作 ...
- 工作流--JBPM核心服务及表结构
一. 使用JBPM开发工作流的一般流程 1. jBPM的运行需要数据库的支持,因此系统设计时要选定所用数据库.只要是Hibernate支持的数据库,jBPM就支持.数据库的初始化 ...
- 两款工作流JBPM和CCBPM的对比
以国外流行的工作流jbpm4的模式与当今中国开源的ccbpm(ccflow和jflow的总称)流程引擎对照.以便让各位能够了解到中国国情的工作流引擎与国际流行的设计规则的差别.不同.与优缺点. 国外工 ...
- Atitit.工作流系统的本质是dsl 图形化的dsl 4gl
Atitit.工作流系统的本质是dsl 图形化的dsl 4gl 1. 工作流系统的本质是dsl 图形化的dsl 4gl1 2. 为什么每个项目系统都需要工作流1 3. 工作流dsl与java .n ...
- 分享下对JAVA程序员成长之路的总结<转>
我也搞了几年JAVA了,由于一向懒惰,没有成为大牛,只是一普通程序猿,手痒来给新人分享下从新手成长为老鸟的已见. 首先初识语法的阶段,必须要学会怎么操作对象,操作if和for,操作list set ...
- JAVA学习路线图---(JAVA1234)
第一阶段-Java基础 这一阶段很重要,关系到你后面阶段的学习,所以务必把这一阶段掌握好: 如果你是0基本,我推荐一本比较好的,适合初学者看的书:明日科技的<Java从入门到精通>,最 ...
- 【转载】分享下多年积累的对JAVA程序员成长之路的总结
注:该文是从百度贴吧转载过来,之前看到觉得写得还不错,对Java开发学习者来说很有意义的,可以看看. 我也搞了几年JAVA了,由于一向懒惰,没有成为大牛,只是一普通程序猿,不爱玩社交网站,不爱玩微博, ...
- GEF的MVC体系结构
摘要: 本文首先介绍了标准的 MVC 体系构架,同时也介绍了最常见的一类 MVC 模式的变种.之后,文章重点介绍了 MVC 结构在 gef 框架中的体现与应用,以及 gef 是如何综合利用工厂模式.命 ...
- java学习大方向
总结Java程序员成长之路 转载 http://bbs.javazhijia.com/topic/1bb0733f80d94aedb50cc3b66d9792b6.html 我也搞了几年JAVA ...
随机推荐
- TCP-IP详解笔记5
TCP-IP详解笔记5 ICMPv4和ICMPv6: Internet控制报文协议 Internet控制报文协议(Internet Control Message Protocol, ICMP)与IP ...
- 推荐一款中国风React组件
最近看这个中国风的组件在掘金也火了一段时间,看了有几天了,也体验了下,感觉还不错,所以准备来安利下 项目地址:https://github.com/zhui-team/zhui 使用手册请参考:htt ...
- 2017蓝桥杯第十题(k倍区间)
#include<iostream> #include<stdio.h> using namespace std; ; ],a[N]; int lowbit(int n){ r ...
- iOS -- Effective Objective-C 阅读笔记 (9)
// 将类的实现方法代码反三到便于管理的数个分类之中. // 类中经常容易填满各种方法, 而这些方法的代码则全部堆在一个巨大的实现文件中, 有时这么做事不合理的,因为即使通过重构把这个类 ...
- C#+EntityFramework编程方式详细之Code First
Code First Code First模式即“代码优先”模式,是从EF4.1开始新建加入的功能.使用Code First模式进行EF开发时只需要编写对应的数据类,然后自动生成数据库. Code F ...
- SpringBoot 集成数据库连接池Druid
1.pom.xml依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid< ...
- Emacs Org-mode 3 表格
Org 使用内置的表格编辑器.可以进行简单的表格编写和计算. Org中的表格 第一个非空字符“|” 视为表格的起始位置,后面的“|” 视为字段分隔符. 3.1 生成表格 编写表格时,可以将字段先写好, ...
- jetbrains的JetBrains PyCharm 2018.3.1破解激活到2100年(最新亲测可用)
破解补丁激活 之前看了好多的其它的方法感觉都不是很靠谱还是这个本人亲试可以长期有效不仅能激活pycharm.jetbrains的JetBrains PyCharm 2018.3.1破解激活到2100年 ...
- 著名的3像素Bug(div+img,多出几像素)
<div><img src="...."></div> 给img的css设置display: block;/*用来去除div下边莫名多出来的3p ...
- SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题
目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...
