网关篇
网关用来控制流程的流向
1. 排他网关
排他网关
(exclusive gateway)(也叫异或网关 XOR gateway,或者更专业的,基于数据的排他网关 exclusive data-based gateway),用于对流程中的决策建模。当执行到达这个网关时,会按照所有出口顺序流定义的顺序对它们进行计算。选择第一个条件计算为true的顺序流(当没有设置条件时,认为顺序流为true)继续流程。
绘制流程图:
对应的XML文件
流程演示
/**
* 完成流程的部署操作
*/
@Test
public void deploy(){
Deployment deploy = repositoryService.createDeployment()
.name("排他网关")
.addClasspathResource("flow/排他网关.bpmn")
.deploy();
System.out.println("deploy.getId() = " + deploy.getId());
}
/**
* 通过流程定义Id 启动
*/
@Test
public void startFlow(){
String processId = "Process_0eykic0:1:efadfc92-39c9-11ed-8f13-c03c59ad2248";
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processId);
System.out.println("processInstance.getId() = " + processInstance.getId());
}
/**
* 完成任务
*/
@Test
public void completeTask(){
Map<String,Object> map = new HashMap<>();
map.put("day",4);
taskService.complete("21a323ee-39ca-11ed-8b49-c03c59ad2248",map);
}
传递的是day=4
会走中间的路线。
2. 并行网关
并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进入和外出顺序流的:
- fork分支:并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
- join汇聚: 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。
注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
与其他网关的主要区别是,并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。
3.包含网关
包含网关可以看做是排他网关和并行网关的结合体。 和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析它们。 但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关一样。
包含网关的功能是基于进入和外出顺序流的:
- 分支: 所有外出顺序流的条件都会被解析,结果为true的顺序流会以并行方式继续执行, 会为每个顺序流创建一个分支。
- 汇聚:所有并行分支到达包含网关,会进入等待状态, 直到每个包含流程token的进入顺序流的分支都到达。 这是与并行网关的最大不同。换句话说,包含网关只会等待被选中执行了的进入顺序流。 在汇聚之后,流程会穿过包含网关继续执行。
当输入day=4
时,走了第二和第三条路线