在Camunda的 Modeler工具中提供了5种类型的网关:
- Exclusive Gateway(独占网关或排他网关)
- Parallel Gateway(并行网关)
- Inclusive Gateway(包容性网关)
- Complex Gateway(复杂网关)
- Event-based Gateway(基于事件的网关)
每一个网关都有自己独特的功能,本章主要介绍Parallel Gateway(并行网关)的使用方式。
1、Parallel Gateway(并行网关)
A parallel gateway (or AND-gateway) allows you to split the flow into concurrent paths.
并行网关(或AND网关)允许您将流拆分为并发路径。
When a parallel gateway with multiple outgoing sequence flows is entered, all flows are taken. The paths are executed concurrently and independently.
当输入具有多个传出序列流的并行网关时,将获取所有流。这些路径是同时独立执行的。
The concurrent paths can be joined using a parallel gateway with multiple incoming sequence flows. The process instance waits at the parallel gateway until each incoming sequence is taken.
可以使用具有多个传入序列流的并行网关来连接并发路径。进程实例在并行网关处等待,直到获取每个传入序列为止。
并行网关的重要特性
(1)一个流程中流程实例只有1个,执行对象有多个;
(2)并行网关的功能是基于进入和外出的顺序流的:
分支(fork):并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
汇聚(join):所有到达并行网关,在此等待的进入分支,直到所有进入顺序流的分支都到达以后,流程就会通过汇聚网关。
(3)并行网关的进入和外出都是用相同的节点标识;
(4)并行网关不会解析条件,即使顺序流中定义了条件,也会被忽略,所以不用在连线上添加流程变量判断流程流向。
重点:
并行网关至少有一条分支被执行,而且所有的分支都会被执行。
并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。
2、业务场景
公司里有个用章的流程,先是部门主任审批,然后下一步就需要项目经理审批,后勤行政主管审批,综合办审批,这三个节点不需要判断,都需要执行 。
并行网关和其他网关不一样,右侧不能设置Condition条件,也就是说并行网关不需要条件,所有的节点都需要触发。
部门主任审批完成后,流程图显示三个节点需要处理,如下图:
部门主任审批完成后,act_ru_task任务表生成三条记录
act_hi_taskinst 历史任务表生成三条记录
3、BPMN流程模型文件
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_14x7iqb" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.12.1" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.19.0">
<bpmn:process id="flow_xmgs_tylc03" name="通用流程03" isExecutable="true" camunda:historyTimeToLive="100">
<bpmn:userTask id="Activity_1jfshj8" name="综合办审批" camunda:assignee="${bmzrapprover}">
<bpmn:incoming>Flow_0n13tl5</bpmn:incoming>
<bpmn:outgoing>Flow_1hom98o</bpmn:outgoing>
<bpmn:multiInstanceLoopCharacteristics camunda:collection="zhbList" camunda:elementVariable="bmzrapprover">
<bpmn:completionCondition xsi:type="bpmn:tFormalExpression">${nrOfCompletedInstances ==1}</bpmn:completionCondition>
</bpmn:multiInstanceLoopCharacteristics>
</bpmn:userTask>
<bpmn:userTask id="Activity_1eadekv" name="后勤行政主管" camunda:assignee="${hqxzzgapprover}">
<bpmn:incoming>Flow_1w2mccm</bpmn:incoming>
<bpmn:outgoing>Flow_0vhd0x0</bpmn:outgoing>
<bpmn:multiInstanceLoopCharacteristics camunda:collection="hqxzzgList" camunda:elementVariable="hqxzzgapprover" />
</bpmn:userTask>
<bpmn:userTask id="Activity_0dp5aff" name="项目经理审批" camunda:assignee="${xmjlapprover}">
<bpmn:incoming>Flow_1mu2q0o</bpmn:incoming>
<bpmn:outgoing>Flow_1idtuv5</bpmn:outgoing>
</bpmn:userTask>
<bpmn:userTask id="Activity_0yme7cw" name="业务审批" camunda:assignee="${hrapprover}">
<bpmn:incoming>Flow_19k7a5z</bpmn:incoming>
<bpmn:outgoing>Flow_1ttjdm2</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_1idtuv5" sourceRef="Activity_0dp5aff" targetRef="Gateway_1bwkty8" />
<bpmn:sequenceFlow id="Flow_1hom98o" sourceRef="Activity_1jfshj8" targetRef="Gateway_1bwkty8" />
<bpmn:sequenceFlow id="Flow_0vhd0x0" sourceRef="Activity_1eadekv" targetRef="Gateway_1bwkty8" />
<bpmn:sequenceFlow id="Flow_19k7a5z" sourceRef="Gateway_1bwkty8" targetRef="Activity_0yme7cw" />
<bpmn:sequenceFlow id="Flow_1mu2q0o" sourceRef="Gateway_0qq9km9" targetRef="Activity_0dp5aff" />
<bpmn:sequenceFlow id="Flow_0n13tl5" sourceRef="Gateway_0qq9km9" targetRef="Activity_1jfshj8" />
<bpmn:sequenceFlow id="Flow_1w2mccm" sourceRef="Gateway_0qq9km9" targetRef="Activity_1eadekv" />
<bpmn:sequenceFlow id="Flow_119uv3d" sourceRef="Activity_0av5lza" targetRef="Gateway_0qq9km9" />
<bpmn:parallelGateway id="Gateway_0qq9km9" name="并行网关">
<bpmn:incoming>Flow_119uv3d</bpmn:incoming>
<bpmn:outgoing>Flow_1mu2q0o</bpmn:outgoing>
<bpmn:outgoing>Flow_0n13tl5</bpmn:outgoing>
<bpmn:outgoing>Flow_1w2mccm</bpmn:outgoing>
</bpmn:parallelGateway>
<bpmn:endEvent id="Event_1bhd1o0" name="结束">
<bpmn:incoming>Flow_1ttjdm2</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_1ttjdm2" sourceRef="Activity_0yme7cw" targetRef="Event_1bhd1o0" />
<bpmn:parallelGateway id="Gateway_1bwkty8">
<bpmn:incoming>Flow_1idtuv5</bpmn:incoming>
<bpmn:incoming>Flow_1hom98o</bpmn:incoming>
<bpmn:incoming>Flow_0vhd0x0</bpmn:incoming>
<bpmn:outgoing>Flow_19k7a5z</bpmn:outgoing>
</bpmn:parallelGateway>
<bpmn:startEvent id="Event_1bb4pen">
<bpmn:outgoing>Flow_03959vw</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="Flow_03959vw" sourceRef="Event_1bb4pen" targetRef="Activity_0av5lza" />
<bpmn:userTask id="Activity_0av5lza" name="部门主任审批">
<bpmn:incoming>Flow_03959vw</bpmn:incoming>
<bpmn:outgoing>Flow_119uv3d</bpmn:outgoing>
</bpmn:userTask>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="flow_xmgs_tylc03">
<bpmndi:BPMNShape id="BPMNShape_05ou9jz" bpmnElement="Activity_1jfshj8">
<dc:Bounds x="560" y="360" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_1hk6vkq" bpmnElement="Activity_1eadekv">
<dc:Bounds x="560" y="220" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_1lurxsj" bpmnElement="Activity_0dp5aff">
<dc:Bounds x="560" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_1ptb9ma" bpmnElement="Activity_0yme7cw">
<dc:Bounds x="840" y="220" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_03cntg7_di" bpmnElement="Gateway_0qq9km9">
<dc:Bounds x="445" y="235" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="448" y="213" width="44" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1bhd1o0_di" bpmnElement="Event_1bhd1o0">
<dc:Bounds x="1012" y="242" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1019" y="285" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_0rf8ahu_di" bpmnElement="Gateway_1bwkty8">
<dc:Bounds x="725" y="235" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1bb4pen_di" bpmnElement="Event_1bb4pen">
<dc:Bounds x="152" y="242" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0bbu7rf_di" bpmnElement="Activity_0av5lza">
<dc:Bounds x="260" y="220" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="BPMNEdge_0f9qh5w" bpmnElement="Flow_1idtuv5">
<di:waypoint x="660" y="120" />
<di:waypoint x="750" y="120" />
<di:waypoint x="750" y="235" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_0h10sev" bpmnElement="Flow_1hom98o">
<di:waypoint x="660" y="400" />
<di:waypoint x="750" y="400" />
<di:waypoint x="750" y="285" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_0lyykuf" bpmnElement="Flow_0vhd0x0">
<di:waypoint x="660" y="260" />
<di:waypoint x="725" y="260" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_126jysm" bpmnElement="Flow_19k7a5z">
<di:waypoint x="775" y="260" />
<di:waypoint x="840" y="260" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_14pbmj0" bpmnElement="Flow_1mu2q0o">
<di:waypoint x="470" y="235" />
<di:waypoint x="470" y="120" />
<di:waypoint x="560" y="120" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1005" y="175" width="23" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_0c8q6v9" bpmnElement="Flow_0n13tl5">
<di:waypoint x="470" y="285" />
<di:waypoint x="470" y="400" />
<di:waypoint x="560" y="400" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1005" y="340" width="23" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="BPMNEdge_1qq53dk" bpmnElement="Flow_1w2mccm">
<di:waypoint x="495" y="260" />
<di:waypoint x="560" y="260" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1049" y="243" width="23" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_119uv3d_di" bpmnElement="Flow_119uv3d">
<di:waypoint x="360" y="260" />
<di:waypoint x="445" y="260" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1ttjdm2_di" bpmnElement="Flow_1ttjdm2">
<di:waypoint x="940" y="260" />
<di:waypoint x="1012" y="260" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_03959vw_di" bpmnElement="Flow_03959vw">
<di:waypoint x="188" y="260" />
<di:waypoint x="260" y="260" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>