目录
一、概述
这也是我们实际场景中用的比较多的网关,并行网关可以表示流程中的并发情况,它允许将流程分成多条分支,也可以将多条分支汇聚到一起,并行网关的功能是基于进入和外出的顺序流:
- 分支:并行后的所有外出顺序流,为每个顺序流都创建一个并发分支
- 汇聚:所有到达并行网关在此等待的进入分支,直到所有进入顺序流的分支都到达以后,流程就会通过汇聚网关
这里有几个注意点:
- 并行网关不会解析条件,即使顺序流中定义了条件,也会被直接忽略
- 在实际使用时,分支与汇聚往往是成对出现的,即有并行开始网关,必定有并行结束网关,否则流程引擎无法判断并行子节点是否都已完成。但是网关是可以不平衡的,即可以有一个并行开始,两个并行结束,同时分支和汇聚的数量也可以不一致
二、并行网关使用
为了使用并行网关,先假设有这么一个场景:某公司需要执行一项财务审批业务,由财务部发起,然后经过所有部门,由各部门分别填写需要审批的金额项,然后先交由各自的部门经理审批,都审批完成后最后交由财务部进行审批。
1、绘制流程图
为了体现注意点2,绘制的流程图网关是不平衡的,如下:
2、启动流程实例
首先启动该流程,代码如下:
@Test
public void parallelGateway2Test() {
// 1、发布流程
Deployment deployment = repositoryService.createDeployment().name("并行网关流程").addClasspathResource("processes/parallelGateway.bpmn20.xml").deploy();
System.out.println("部署id:" + deployment.getId());
// 2、启动一个流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("parallelGateway");
System.out.println("实例id:" + processInstance.getProcessInstanceId());
System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
// 3、查询所有并行任务
List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).list();
Assert.assertEquals(3, tasks.size());
System.out.println("任务数量:" + tasks.size());
}
启动后我们查看act_ru_execution表,一共生成了四条记录,一条流程实例,三条执行对象,与流程图匹配
查看act_ru_task表,也有三条正在执行的任务记录:
3、流程流转
完成任务代码:
@Test
public void completeTask() {
String taskId = "47512";
taskService.complete(taskId);
}
首先完成部门1任务,可以看到流程实例自动流转到下一个任务 部门1经理:
然后完成部门2任务,可以看到完成后并不会直接流转到部门2,3经理,因为中间有一个汇聚网关,需要等到所有进入顺序流的分支都到达以后才能流转。
完成部门3任务以后可以看到已自动流转:
由于后面还有一个汇聚网关,也需要部门1经理任务和部门2,3经理任务全部完成后才能出网关,落到财务部。