一.简介
Flowable 中常用的网关主要有三种类型,分别是:
- 排他网关
- 并行网关
- 包容网关
下面来说下这三种的网关的概念和用法。
二.并行网关
并行网关,这种网关一般用在并行任务上,截图如下:
并行网关一般是成对出现的,一个出现的并行网关用来分流,第二个出现的并行网关用来聚合。
举一个并行网关的例子,截图如下:
这是一个简化的生产笔记本的流程图,当屏幕和键盘都生产好之后,再进行组装,整个流程图中存在两个并行网关(成对出现)。
在这个流程图中,连接线上是不需要设置条件的,这里即使设置了条件,这个条件也是不会生效的。
下载这个XML文件,XML文件的内容如下:
<process id="demo01" name="测试流程" isExecutable="true">
<documentation>测试流程</documentation>
<startEvent id="sid-4F7F76BA-526A-4D8C-B45A-02FC1C56CA47" flowable:formFieldValidation="true"></startEvent>
<sequenceFlow id="sid-11130848-EA1F-458A-A45D-49CBC49428C8" sourceRef="sid-4F7F76BA-526A-4D8C-B45A-02FC1C56CA47" targetRef="sid-6D01D4BE-C475-4270-8745-92752EA2C038"></sequenceFlow>
<parallelGateway id="sid-6D01D4BE-C475-4270-8745-92752EA2C038"></parallelGateway>
<userTask id="sid-54DD6BFA-FE6C-4DE7-9038-3DEEAF85002C" name="生产屏幕" flowable:assignee="zhangsan" flowable:formFieldValidation="true">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<sequenceFlow id="sid-8DD3383C-45D1-4EAF-9A22-702A5B9D0869" sourceRef="sid-6D01D4BE-C475-4270-8745-92752EA2C038" targetRef="sid-54DD6BFA-FE6C-4DE7-9038-3DEEAF85002C"></sequenceFlow>
<userTask id="sid-7797ED55-155F-4D17-8EA5-DE40434C421B" name="生产键盘" flowable:assignee="lisi" flowable:formFieldValidation="true">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<sequenceFlow id="sid-6E992E8B-CF71-411D-B537-42FEDF4F4209" sourceRef="sid-6D01D4BE-C475-4270-8745-92752EA2C038" targetRef="sid-7797ED55-155F-4D17-8EA5-DE40434C421B"></sequenceFlow>
<sequenceFlow id="sid-8DCA9516-FFED-4781-9ACC-530DC6E63755" sourceRef="sid-7797ED55-155F-4D17-8EA5-DE40434C421B" targetRef="sid-98D3C336-9AD9-4964-9CCB-496C850EE40F"></sequenceFlow>
<sequenceFlow id="sid-EE80AE42-D021-4B9F-A91E-BD37C512EE65" sourceRef="sid-54DD6BFA-FE6C-4DE7-9038-3DEEAF85002C" targetRef="sid-98D3C336-9AD9-4964-9CCB-496C850EE40F"></sequenceFlow>
<userTask id="sid-4FFE361A-E2AF-4481-BACF-1E618E8C4A26" name="组装" flowable:assignee="javaboy" flowable:formFieldValidation="true">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<sequenceFlow id="sid-8CABC6E8-E36A-4814-B897-817D4A9F231C" sourceRef="sid-98D3C336-9AD9-4964-9CCB-496C850EE40F" targetRef="sid-4FFE361A-E2AF-4481-BACF-1E618E8C4A26"></sequenceFlow>
<endEvent id="sid-BF02170B-8138-4867-AE01-E3B29505183D"></endEvent>
<sequenceFlow id="sid-F72B2A15-913F-436E-8AD7-6A6FB190E197" sourceRef="sid-4FFE361A-E2AF-4481-BACF-1E618E8C4A26" targetRef="sid-BF02170B-8138-4867-AE01-E3B29505183D"></sequenceFlow>
<parallelGateway id="sid-98D3C336-9AD9-4964-9CCB-496C850EE40F"></parallelGateway>
</process>
接下来部署这个流程并启动。
流程启动成功之后,在 ACT_RU_TASK 表中发现有两个需要执行的 Task,截图如下:
这两个 Task,如果只执行掉其中一个,那么还剩下另外一个 Task,如果两个都执行了,那么就会看到一个新的 Task,截图如下(两个并行任务执行完成后,进入到下一个任务):
三.包容网关
包容网关,也叫相容网关、兼容网关等,截图如下:
包容谁呢?包容排他网关和并行网关。也就是说,这种包容网关可以根据实际条件转为排他网关或者并行网关。
这边举个例子:
假如说报销金额大于 500,张三审批,报销金额大于 1000,则需要张三和李四同时审批,且张三和李四审批无先后顺序。流程图如下:
在报销金额大于 500 上设置条件,截图如下:
在报销金额大于 1000 上设置条件,截图如下:
接下来部署这个流程。部署好之后,首先来启动流程,第一次启动的时候,我们设置报销金额为 666,代码如下:
@Test
void test01() {
Map<String, Object> variables = new HashMap<>();
variables.put("money", 666);
ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo01", variables);
logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}
流程启动之后,在 ACT_RU_TASK 表中可以看到,该 zhangsan 审批了,截图如下:
zhangsan 审批之后,就是 wangwu 审批了,此时这两个审批就是一个排他任务了。
假设我们启动流程的时候,报销金额为 2000,代码如下:
@Test
void test01() {
Map<String, Object> variables = new HashMap<>();
variables.put("money", 2000);
ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo01", variables);
logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}
那么此时就会看到,在 ACT_RU_TASK 表中,出现了两条记录,分别是 zhangsan 审批和 lisi 审批,此时这两个审批就是一个并行任务了,截图如下:
接下来就按并行任务的模式来,这两个人都审批了,才会进入到 wangwu 审批。
这就是兼容网关的特点,即根据实际情况,会变成排他网关或者并行网关。