5.fork/join节点(分支/聚合)
该节点主要解决流程并发问题,Fork代表分支,将一个流程分成若干个子流程,Join是将多个分支合并到一起,在继续执行。
注:fork和join必须同时使用
来看下面一个demo:
<?xml version="1.0" encoding="UTF-8"?>
<process name="demo5_forkjoin" xmlns="http://jbpm.org/4.4/jpdl">
<start name="start1" g="278,18,48,48">
<transition name="to 进行购物" to="进行购物" g="-69,-22"/>
</start>
<end name="end1" g="282,312,48,48"/>
<task name="进行购物" g="259,87,92,52">
<transition name="to fork1" to="fork1" g="-52,-22"/>
</task>
<fork name="fork1" g="286,161,48,48">
<transition name="to 发货" to="发货" g="-45,-22"/>
<transition name="to 收钱" to="收钱" g="-45,-22"/>
</fork>
<join name="join1" g="283,244,48,48">
<transition name="to end1" to="end1" g="-50,-22"/>
</join>
<task name="发货" g="125,205,92,52">
<transition name="to join1" to="join1" g="-49,-22"/>
</task>
<task name="收钱" g="430,218,92,52">
<transition name="to join1" to="join1" g="-49,-22"/>
</task>
</process>
以上流程图和该流程图对应的xml配置文件,反映了一个网购最简单的流程,就是网上下单后,可以选择货到付款或者先付款再发货,只要完成了‘发货’和‘收钱’两个任务即可结束
该流程,无所谓谁先谁后,这就用到了fork和join节点。
注:虽然图中fork和join节点都是一样的图标,但这俩真心不是一个节点啊
下面说说具体流程数据库中表的变化
(1)工作流程发布,启动都不必我多说,启动后,jbpm4_task表中数据如下:
(2)执行下面代码完成第一步‘进行购物’(工作流程启动后就在这步)
@Test
<span style="white-space:pre"> </span>public void demo3(){
<span style="white-space:pre"> </span>TaskService taskService = new Configuration().getProcessEngine().getTaskService();
taskService.completeTask("10002");
}
此时jbpm4_task表中数据如下:
jbpm4_execution表中数据如下:
可以清楚的看到,此时jbpm4_task任务表中有两个任务,jbpm4_execution流程实例表中有3个实例,20001和20002是子实例,这是怎么看出来的呢,jbpm4_execution有一个字段
parent,第一条记录是null,第二条和第三条的parent都记录10001,懂了吧!
(3)接下来执行下面代码:
<span style="white-space:pre"> </span>@Test
public void demo3(){
TaskService taskService = new Configuration().getProcessEngine().getTaskService();
taskService.completeTask("20003");
}
也就是说,执行'发货'任务,jbpm4_task数据如下:
jbpm4_execution表数据如下:
可以清楚地看到,jbpm4_task表中‘发货’任务已经不存在了,因为该任务已经执行结束。
再来看jbpm4_exection表,ACTIVITYNAME字段,‘发货’的流程实例的ACTIVITYNAME字段变为了'join1',说明在等待其他fork子流程的结束(这里只剩一个‘收钱’没执行了)。
(4)接着执行下面代码:
<span style="white-space:pre"> </span>@Test
public void demo3(){
TaskService taskService = new Configuration().getProcessEngine().getTaskService();
taskService.completeTask("20005");
}
‘收钱’任务也执行结束了,jbpm4_task表中不存在任何关于该任务的数据了(按照我现在的表来看,就是空的),
jbpm4_execution表中也没有任何数据了。
注:该流程结束,虽然过程中jbpm4_execution流程实例表中存在过3条此流程记录,但因为其他两条是子流程,所以该流程结束后,jbpm4_hist_procinst流程实例历史表中只有一条记录,如下图所示:
那么问题来了,流程实例历史表中查不到子流程信息,那上哪去查呢?jbpm4_hist_actinst流程活动实例表,数据如下所示:
在企业应用中FORK/JOIN节点有什么作用呢?会签(就是一个文件需要很多人签字,但是签字不分顺序,只要都签完了就行)