activiti并行网关(Parallel Gateway)

1.什么是并行网关?

它可以将分支(fork)为多个路径,也可以合并(join)多个入口路径。

2.使用场景:

场景一:在一个政府机关的办公OA系统设计的时候,有这么一个需求:政府需要做一个财务呈批的业务,由财务部门发起,然后经过其他所有部门,各部门根据自己的资金需求填写申请表,然后经过各自部门的领导去审核,各自部门领导审核完成,然后合并给财务部领导审核。

场景二:该政府部门还有一个需求,就是各个部门填完申请表后,到了领导去审核的时候,我们需要各个部门的领导共同决定要不要放款。

3.并行网关两个重要特性:

  • 分支(fork): 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。 
  • 合并(join): 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。 

4.注意点:

1.如果并行网关同时具有入口顺序流和出口顺序流,并行网关会先执行入口顺序流,然后执行再分裂成多条可以执行的路径。

2.并行网关不执行计算条件。并行网关上面的计算条件会被忽略。

3.并行网关分支和合并是同时存在的,就是说,一个至少有一个分支和一个合并。但是,网关是可以不平衡的,分支和合并的数量可以不一致。

5.并行网关的标识:并行网关,用内部带有’加号’图标的网关(菱形)表示,代表与(AND)的含义。

6.流程设计图:

7.流程源码:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
  <process id="ParallelGatewayTest01" isExecutable="true">
    <startEvent id="sid-166AB575-206F-4C06-87AA-6F646B332F7F"></startEvent>
    <parallelGateway id="sid-52E5C6C4-69CF-462A-9583-72568BE5692D"></parallelGateway>
    <userTask id="sid-E4B059DD-FB7E-4181-BED5-588EC77647A1" name="员工一" activiti:assignee="admin"></userTask>
    <userTask id="sid-EA859B8D-3245-4584-98C8-DE0E35319DA5" name="员工二" activiti:assignee="admin"></userTask>
    <userTask id="sid-C06A652D-3CA7-4000-A2B3-6313E03C679A" name="部门经理" activiti:assignee="admin"></userTask>
    <parallelGateway id="sid-1434ED04-ADFE-4410-8A68-327500DA4C04"></parallelGateway>
    <sequenceFlow id="sid-EDCEFC1E-8C16-406B-9A75-997DF7CFAA03" sourceRef="sid-1434ED04-ADFE-4410-8A68-327500DA4C04" targetRef="sid-C06A652D-3CA7-4000-A2B3-6313E03C679A"></sequenceFlow>
    <sequenceFlow id="sid-2C603D09-4CDA-4BF7-8C81-BC543541AF36" sourceRef="sid-166AB575-206F-4C06-87AA-6F646B332F7F" targetRef="sid-52E5C6C4-69CF-462A-9583-72568BE5692D"></sequenceFlow>
    <sequenceFlow id="sid-F7B8E655-8FC5-4205-93D8-64F39881DE28" sourceRef="sid-E4B059DD-FB7E-4181-BED5-588EC77647A1" targetRef="sid-1434ED04-ADFE-4410-8A68-327500DA4C04"></sequenceFlow>
    <sequenceFlow id="sid-EEBE283A-BB90-44E1-A6FA-88AA1CE52C39" sourceRef="sid-EA859B8D-3245-4584-98C8-DE0E35319DA5" targetRef="sid-1434ED04-ADFE-4410-8A68-327500DA4C04"></sequenceFlow>
    <sequenceFlow id="sid-BC06774A-44A2-43FA-BDF4-A5E701B3999A" sourceRef="sid-52E5C6C4-69CF-462A-9583-72568BE5692D" targetRef="sid-E4B059DD-FB7E-4181-BED5-588EC77647A1"></sequenceFlow>
    <userTask id="sid-C18060F2-D0AB-4E71-A7B6-6D3654E93FFF" name="主管" activiti:assignee="admin"></userTask>
    <sequenceFlow id="sid-7BA5A3D9-7BA9-4A3E-AF0A-E0F05A20FCC2" sourceRef="sid-52E5C6C4-69CF-462A-9583-72568BE5692D" targetRef="sid-C18060F2-D0AB-4E71-A7B6-6D3654E93FFF"></sequenceFlow>
    <sequenceFlow id="sid-035CCFB1-2074-409A-8ADB-13CD37A98A1E" sourceRef="sid-52E5C6C4-69CF-462A-9583-72568BE5692D" targetRef="sid-EA859B8D-3245-4584-98C8-DE0E35319DA5"></sequenceFlow>
    <parallelGateway id="sid-A0A5DB28-FFC6-4B14-ABC5-EE9310E39B53"></parallelGateway>
    <sequenceFlow id="sid-C2EBDC51-ABEC-4B69-9924-0101B7EA9E91" sourceRef="sid-C06A652D-3CA7-4000-A2B3-6313E03C679A" targetRef="sid-A0A5DB28-FFC6-4B14-ABC5-EE9310E39B53"></sequenceFlow>
    <sequenceFlow id="sid-85C1D7AE-4568-427E-8E6D-AFC79ED41FD9" sourceRef="sid-C18060F2-D0AB-4E71-A7B6-6D3654E93FFF" targetRef="sid-A0A5DB28-FFC6-4B14-ABC5-EE9310E39B53"></sequenceFlow>
    <userTask id="sid-CA755ED3-B18F-41D0-BBE5-22D41CFCF024" name="老板" activiti:assignee="admin"></userTask>
    <sequenceFlow id="sid-FD581601-B9AC-4E1E-8161-8EA8A84844B2" sourceRef="sid-A0A5DB28-FFC6-4B14-ABC5-EE9310E39B53" targetRef="sid-CA755ED3-B18F-41D0-BBE5-22D41CFCF024"></sequenceFlow>
    <endEvent id="sid-5EC7D180-D117-4F36-809B-E8940DB9FE91"></endEvent>
    <sequenceFlow id="sid-78026DEB-C4DA-4BF4-9723-C4EE9124E785" sourceRef="sid-CA755ED3-B18F-41D0-BBE5-22D41CFCF024" targetRef="sid-5EC7D180-D117-4F36-809B-E8940DB9FE91"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_ParallelGatewayTest01">
    <bpmndi:BPMNPlane bpmnElement="ParallelGatewayTest01" id="BPMNPlane_ParallelGatewayTest01">
      <bpmndi:BPMNShape bpmnElement="sid-166AB575-206F-4C06-87AA-6F646B332F7F" id="BPMNShape_sid-166AB575-206F-4C06-87AA-6F646B332F7F">
        <omgdc:Bounds height="35.0" width="35.0" x="109.0" y="142.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-52E5C6C4-69CF-462A-9583-72568BE5692D" id="BPMNShape_sid-52E5C6C4-69CF-462A-9583-72568BE5692D">
        <omgdc:Bounds height="40.0" width="40.0" x="180.0" y="140.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-E4B059DD-FB7E-4181-BED5-588EC77647A1" id="BPMNShape_sid-E4B059DD-FB7E-4181-BED5-588EC77647A1">
        <omgdc:Bounds height="80.0" width="100.0" x="277.0" y="24.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-EA859B8D-3245-4584-98C8-DE0E35319DA5" id="BPMNShape_sid-EA859B8D-3245-4584-98C8-DE0E35319DA5">
        <omgdc:Bounds height="80.0" width="100.0" x="277.0" y="120.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-C06A652D-3CA7-4000-A2B3-6313E03C679A" id="BPMNShape_sid-C06A652D-3CA7-4000-A2B3-6313E03C679A">
        <omgdc:Bounds height="80.0" width="100.0" x="480.0" y="75.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-1434ED04-ADFE-4410-8A68-327500DA4C04" id="BPMNShape_sid-1434ED04-ADFE-4410-8A68-327500DA4C04">
        <omgdc:Bounds height="40.0" width="40.0" x="413.0" y="97.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-C18060F2-D0AB-4E71-A7B6-6D3654E93FFF" id="BPMNShape_sid-C18060F2-D0AB-4E71-A7B6-6D3654E93FFF">
        <omgdc:Bounds height="80.0" width="100.0" x="277.0" y="225.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-A0A5DB28-FFC6-4B14-ABC5-EE9310E39B53" id="BPMNShape_sid-A0A5DB28-FFC6-4B14-ABC5-EE9310E39B53">
        <omgdc:Bounds height="40.0" width="40.0" x="615.0" y="180.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-CA755ED3-B18F-41D0-BBE5-22D41CFCF024" id="BPMNShape_sid-CA755ED3-B18F-41D0-BBE5-22D41CFCF024">
        <omgdc:Bounds height="80.0" width="100.0" x="690.0" y="161.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-5EC7D180-D117-4F36-809B-E8940DB9FE91" id="BPMNShape_sid-5EC7D180-D117-4F36-809B-E8940DB9FE91">
        <omgdc:Bounds height="35.0" width="35.0" x="830.0" y="183.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="sid-EDCEFC1E-8C16-406B-9A75-997DF7CFAA03" id="BPMNEdge_sid-EDCEFC1E-8C16-406B-9A75-997DF7CFAA03">
        <omgdi:waypoint x="453.0" y="117.0"></omgdi:waypoint>
        <omgdi:waypoint x="480.0" y="115.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-2C603D09-4CDA-4BF7-8C81-BC543541AF36" id="BPMNEdge_sid-2C603D09-4CDA-4BF7-8C81-BC543541AF36">
        <omgdi:waypoint x="144.0" y="159.0"></omgdi:waypoint>
        <omgdi:waypoint x="180.0" y="160.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-F7B8E655-8FC5-4205-93D8-64F39881DE28" id="BPMNEdge_sid-F7B8E655-8FC5-4205-93D8-64F39881DE28">
        <omgdi:waypoint x="377.0" y="64.0"></omgdi:waypoint>
        <omgdi:waypoint x="433.0" y="64.0"></omgdi:waypoint>
        <omgdi:waypoint x="433.0" y="97.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-EEBE283A-BB90-44E1-A6FA-88AA1CE52C39" id="BPMNEdge_sid-EEBE283A-BB90-44E1-A6FA-88AA1CE52C39">
        <omgdi:waypoint x="377.0" y="160.0"></omgdi:waypoint>
        <omgdi:waypoint x="433.0" y="160.0"></omgdi:waypoint>
        <omgdi:waypoint x="433.0" y="137.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-BC06774A-44A2-43FA-BDF4-A5E701B3999A" id="BPMNEdge_sid-BC06774A-44A2-43FA-BDF4-A5E701B3999A">
        <omgdi:waypoint x="200.0" y="140.0"></omgdi:waypoint>
        <omgdi:waypoint x="200.0" y="64.0"></omgdi:waypoint>
        <omgdi:waypoint x="277.0" y="64.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-7BA5A3D9-7BA9-4A3E-AF0A-E0F05A20FCC2" id="BPMNEdge_sid-7BA5A3D9-7BA9-4A3E-AF0A-E0F05A20FCC2">
        <omgdi:waypoint x="200.0" y="180.0"></omgdi:waypoint>
        <omgdi:waypoint x="200.0" y="265.0"></omgdi:waypoint>
        <omgdi:waypoint x="277.0" y="265.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-035CCFB1-2074-409A-8ADB-13CD37A98A1E" id="BPMNEdge_sid-035CCFB1-2074-409A-8ADB-13CD37A98A1E">
        <omgdi:waypoint x="220.0" y="160.0"></omgdi:waypoint>
        <omgdi:waypoint x="277.0" y="160.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-C2EBDC51-ABEC-4B69-9924-0101B7EA9E91" id="BPMNEdge_sid-C2EBDC51-ABEC-4B69-9924-0101B7EA9E91">
        <omgdi:waypoint x="580.0" y="115.0"></omgdi:waypoint>
        <omgdi:waypoint x="635.0" y="115.0"></omgdi:waypoint>
        <omgdi:waypoint x="635.0" y="180.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-85C1D7AE-4568-427E-8E6D-AFC79ED41FD9" id="BPMNEdge_sid-85C1D7AE-4568-427E-8E6D-AFC79ED41FD9">
        <omgdi:waypoint x="377.0" y="265.0"></omgdi:waypoint>
        <omgdi:waypoint x="635.0" y="265.0"></omgdi:waypoint>
        <omgdi:waypoint x="635.0" y="220.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-FD581601-B9AC-4E1E-8161-8EA8A84844B2" id="BPMNEdge_sid-FD581601-B9AC-4E1E-8161-8EA8A84844B2">
        <omgdi:waypoint x="655.0" y="200.0"></omgdi:waypoint>
        <omgdi:waypoint x="690.0" y="201.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-78026DEB-C4DA-4BF4-9723-C4EE9124E785" id="BPMNEdge_sid-78026DEB-C4DA-4BF4-9723-C4EE9124E785">
        <omgdi:waypoint x="790.0" y="201.0"></omgdi:waypoint>
        <omgdi:waypoint x="830.0" y="200.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

8.运行流程:

package parallelGateway;

import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

public class ParallelGatewayTest01 {
	/** 完成我的任务  */
	public static void main(String[] args) throws InterruptedException {
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		RepositoryService repositoryService = processEngine.getRepositoryService();
		repositoryService.createDeployment()
						 .addClasspathResource("diagrams/ParallelGateway/ParallelGatewayTest01.bpmn")
						 .deploy();
		System.out.println("流程部署成功!");// 流程定义ID
		// 流程定义的key
		String processDefinitionKey = "ParallelGatewayTest01";// 绘制的流程图ID
		ProcessInstance pi = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
				.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值。使用key值启动好处:默认是按照最新版本的流程定义启动
		String procesInstanceId = pi.getId();
		System.out.println("流程实例ID:" + procesInstanceId);
		System.out.println("流程定义ID:" + pi.getProcessDefinitionId());
	
		TaskService taskService = processEngine.getTaskService();
		while(processEngine.getRuntimeService()
				.createProcessInstanceQuery()
				.processInstanceId(procesInstanceId)
				.singleResult()!=null){//如果流程实例没有结束就一直查询当前实例的用户任务
			// 查询当前到达的任务(多线)
			List<Task> tasks = taskService.createTaskQuery()
										  .processInstanceId(procesInstanceId)
										  .list();
			for (Task t : tasks) {
				// 完成当前运行节点任务
				taskService.complete(t.getId());//完成任务时必须把变量传过去不然会报错!
				System.out.println("任务 " + t.getName() + " 执行完成!");
				System.out.println("===================================");
			}
		}

	}
}

9.运行结果

流程部署成功!
流程实例ID:165005
流程定义ID:ParallelGatewayTest01:9:165004
任务 员工一 执行完成!
===================================
任务 主管 执行完成!
===================================
任务 员工二 执行完成!
===================================
任务 部门经理 执行完成!
===================================
任务 老板 执行完成!
===================================

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值