Camunda工作流网关(二)-Parallel Gateway(并行网关)


在Camunda的 Modeler工具中提供了5种类型的网关:

  1. Exclusive Gateway(独占网关或排他网关)
  2. Parallel Gateway(并行网关)
  3. Inclusive Gateway(包容性网关)
  4. Complex Gateway(复杂网关)
  5. 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>

### 如何在Java中嵌入和实现工作流程 #### 使用Activiti作为工作流引擎 为了在Java项目中集成工作流功能,可以选择使用Activiti这样的成熟解决方案。Activiti是一款遵循Apache许可证的开源工作流和业务流程管理平台[^3]。 #### 初始化Activiti环境 要开始使用Activiti,在Maven项目的`pom.xml`文件里加入依赖项: ```xml <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>7.0.0.M4</version> </dependency> ``` 这一步骤确保了所有必要的库都被下载并配置好以便后续操作[^1]。 #### 创建流程定义 接着,创建XML格式的BPMN 2.0模型来描述具体的业务逻辑。例如,下面展示了一个简单的请假申请审批流程: ```xml <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" targetNamespace="Examples"> <process id="leaveRequestProcess" name="Leave Request Process"> <!-- Start Event --> <startEvent id="theStart"/> <!-- User Task for Submitting Leave Application --> <userTask id="submitApplication" name="Submit Leave Application"/> <!-- Exclusive Gateway to decide approval path --> <exclusiveGateway id="decisionPoint"/> <!-- User Tasks based on decision outcome --> <userTask id="approveOrReject" name="Manager Approves or Rejects"/> <!-- End Events depending upon the flow taken --> <endEvent id="approvedEnd"/> <endEvent id="rejectedEnd"/> <!-- Sequence Flows connecting elements together --> <sequenceFlow sourceRef="theStart" targetRef="submitApplication"/> <sequenceFlow sourceRef="submitApplication" targetRef="decisionPoint"/> <sequenceFlow sourceRef="decisionPoint" targetRef="approveOrReject"/> <sequenceFlow sourceRef="approveOrReject" targetRef="approvedEnd"/> <sequenceFlow sourceRef="decisionPoint" targetRef="rejectedEnd"/> </process> </definitions> ``` 此段代码展示了如何利用标准的BPMN元素构建一个基本的工作流结构。 #### 启动流程实例 一旦有了流程定义之后,则可以通过编程方式启动一个新的流程实例。这里给出了一段用于初始化流程引擎以及启动新流程实例的例子: ```java import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RuntimeService; public class WorkflowExample { public static void main(String[] args){ // 获取默认配置下的流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); // 根据已部署的流程定义key启动流程实例 String processDefinitionKey = "leaveRequest"; Map<String, Object> variables = new HashMap<>(); variables.put("employeeName", "John Doe"); runtimeService.startProcessInstanceByKey(processDefinitionKey, variables); } } ``` 这段代码片段说明了怎样通过设置变量参数的方式触发特定条件下的自动化处理路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hardworkl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值