并行网关 Parallel Gateway

作者:Jesai

2018年3月25日 00:26:21

前言:

做工作流时间长后,慢慢的就会发现,很多客户会需要会签的功能,会签的情况也有很多种,实现的方式也不一样。在这里我们先讨论下并行网关,会签放到后面去讨论。

情景一:

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

情景二:

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

我们很容易想到该流程应该是这样的:

图-1 审批流程简化图

分析:前提是每一个部门都需要申请,每一个领导都需要审批。

那么,我们可以使用我们的并行网关来实现。

并行网关:

什么是并行网关?

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

并行网关的前提条件:

基于出口顺序流和入口顺序流。

并行网关两个重要特性:

分支(fork): 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。

合并(join): 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。

注意:

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

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

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

并行网关的标识:

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

定义并行网关:

 <parallelGateway id="myParallelGateway" />

流程设计:

图-2 并行网关设计图

流程源码:

 <?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="process" isExecutable="true">

     <startEvent id="sid-166AB575-206F-4C06-87AA-6F646B332F7F" />

     <parallelGateway id="sid-52E5C6C4-69CF-462A-9583-72568BE5692D" />

     <userTask id="sid-E4B059DD-FB7E-4181-BED5-588EC77647A1" name="员工一" activiti:assignee="admin" />

     <userTask id="sid-EA859B8D-3245-4584-98C8-DE0E35319DA5" name="员工二" activiti:assignee="admin" />

     <userTask id="sid-C06A652D-3CA7-4000-A2B3-6313E03C679A" name="部门经理" activiti:assignee="admin" />

     <parallelGateway id="sid-1434ED04-ADFE-4410-8A68-327500DA4C04" />

     <sequenceFlow id="sid-EDCEFC1E-8C16-406B-9A75-997DF7CFAA03" sourceRef="sid-1434ED04-ADFE-4410-8A68-327500DA4C04" targetRef="sid-C06A652D-3CA7-4000-A2B3-6313E03C679A" />

     <sequenceFlow id="sid-2C603D09-4CDA-4BF7-8C81-BC543541AF36" sourceRef="sid-166AB575-206F-4C06-87AA-6F646B332F7F" targetRef="sid-52E5C6C4-69CF-462A-9583-72568BE5692D" />

     <sequenceFlow id="sid-F7B8E655-8FC5-4205-93D8-64F39881DE28" sourceRef="sid-E4B059DD-FB7E-4181-BED5-588EC77647A1" targetRef="sid-1434ED04-ADFE-4410-8A68-327500DA4C04" />

     <sequenceFlow id="sid-EEBE283A-BB90-44E1-A6FA-88AA1CE52C39" sourceRef="sid-EA859B8D-3245-4584-98C8-DE0E35319DA5" targetRef="sid-1434ED04-ADFE-4410-8A68-327500DA4C04" />

     <sequenceFlow id="sid-BC06774A-44A2-43FA-BDF4-A5E701B3999A" sourceRef="sid-52E5C6C4-69CF-462A-9583-72568BE5692D" targetRef="sid-E4B059DD-FB7E-4181-BED5-588EC77647A1" />

     <userTask id="sid-C18060F2-D0AB-4E71-A7B6-6D3654E93FFF" name="主管" activiti:assignee="admin" />

     <sequenceFlow id="sid-7BA5A3D9-7BA9-4A3E-AF0A-E0F05A20FCC2" sourceRef="sid-52E5C6C4-69CF-462A-9583-72568BE5692D" targetRef="sid-C18060F2-D0AB-4E71-A7B6-6D3654E93FFF" />

     <sequenceFlow id="sid-035CCFB1-2074-409A-8ADB-13CD37A98A1E" sourceRef="sid-52E5C6C4-69CF-462A-9583-72568BE5692D" targetRef="sid-EA859B8D-3245-4584-98C8-DE0E35319DA5" />

     <parallelGateway id="sid-A0A5DB28-FFC6-4B14-ABC5-EE9310E39B53" />

     <sequenceFlow id="sid-C2EBDC51-ABEC-4B69-9924-0101B7EA9E91" sourceRef="sid-C06A652D-3CA7-4000-A2B3-6313E03C679A" targetRef="sid-A0A5DB28-FFC6-4B14-ABC5-EE9310E39B53" />

     <sequenceFlow id="sid-85C1D7AE-4568-427E-8E6D-AFC79ED41FD9" sourceRef="sid-C18060F2-D0AB-4E71-A7B6-6D3654E93FFF" targetRef="sid-A0A5DB28-FFC6-4B14-ABC5-EE9310E39B53" />

     <userTask id="sid-CA755ED3-B18F-41D0-BBE5-22D41CFCF024" name="老板" activiti:assignee="admin" />

     <sequenceFlow id="sid-FD581601-B9AC-4E1E-8161-8EA8A84844B2" sourceRef="sid-A0A5DB28-FFC6-4B14-ABC5-EE9310E39B53" targetRef="sid-CA755ED3-B18F-41D0-BBE5-22D41CFCF024" />

     <endEvent id="sid-5EC7D180-D117-4F36-809B-E8940DB9FE91" />

     <sequenceFlow id="sid-78026DEB-C4DA-4BF4-9723-C4EE9124E785" sourceRef="sid-CA755ED3-B18F-41D0-BBE5-22D41CFCF024" targetRef="sid-5EC7D180-D117-4F36-809B-E8940DB9FE91" />

   </process>

   <bpmndi:BPMNDiagram id="BPMNDiagram_process">

     <bpmndi:BPMNPlane bpmnElement="process" id="BPMNPlane_process">

       <bpmndi:BPMNShape bpmnElement="sid-166AB575-206F-4C06-87AA-6F646B332F7F" id="BPMNShape_sid-166AB575-206F-4C06-87AA-6F646B332F7F">

         <omgdc:Bounds height="30.0" width="30.0" x="75.0" y="145.0" />

       </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" />

       </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" />

       </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" />

       </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" />

       </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" />

       </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" />

       </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" />

       </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="150.0" />

       </bpmndi:BPMNShape>

       <bpmndi:BPMNShape bpmnElement="sid-5EC7D180-D117-4F36-809B-E8940DB9FE91" id="BPMNShape_sid-5EC7D180-D117-4F36-809B-E8940DB9FE91">

         <omgdc:Bounds height="28.0" width="28.0" x="835.0" y="176.0" />

       </bpmndi:BPMNShape>

       <bpmndi:BPMNEdge bpmnElement="sid-2C603D09-4CDA-4BF7-8C81-BC543541AF36" id="BPMNEdge_sid-2C603D09-4CDA-4BF7-8C81-BC543541AF36">

         <omgdi:waypoint x="105.0" y="160.0" />

         <omgdi:waypoint x="180.0" y="160.0" />

       </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 x="433.0" y="160.0" />

         <omgdi:waypoint x="433.0" y="137.0" />

       </bpmndi:BPMNEdge>

       <bpmndi:BPMNEdge bpmnElement="sid-7BA5A3D9-7BA9-4A3E-AF0A-E0F05A20FCC2" id="BPMNEdge_sid-7BA5A3D9-7BA9-4A3E-AF0A-E0F05A20FCC2">

         <omgdi:waypoint x="200.5" y="179.5" />

         <omgdi:waypoint x="200.5" y="265.0" />

         <omgdi:waypoint x="277.0" y="265.0" />

       </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 x="635.5" y="115.0" />

         <omgdi:waypoint x="635.5" y="180.5" />

       </bpmndi:BPMNEdge>

       <bpmndi:BPMNEdge bpmnElement="sid-BC06774A-44A2-43FA-BDF4-A5E701B3999A" id="BPMNEdge_sid-BC06774A-44A2-43FA-BDF4-A5E701B3999A">

         <omgdi:waypoint x="200.5" y="140.5" />

         <omgdi:waypoint x="200.5" y="64.0" />

         <omgdi:waypoint x="277.0" y="64.0" />

       </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 x="433.0" y="64.0" />

         <omgdi:waypoint x="433.0" y="97.0" />

       </bpmndi:BPMNEdge>

       <bpmndi:BPMNEdge bpmnElement="sid-FD581601-B9AC-4E1E-8161-8EA8A84844B2" id="BPMNEdge_sid-FD581601-B9AC-4E1E-8161-8EA8A84844B2">

         <omgdi:waypoint x="653.6739130434783" y="198.67391304347825" />

         <omgdi:waypoint x="690.0" y="195.02392344497608" />

       </bpmndi:BPMNEdge>

       <bpmndi:BPMNEdge bpmnElement="sid-EDCEFC1E-8C16-406B-9A75-997DF7CFAA03" id="BPMNEdge_sid-EDCEFC1E-8C16-406B-9A75-997DF7CFAA03">

         <omgdi:waypoint x="452.9949494949495" y="116.9949494949495" />

         <omgdi:waypoint x="480.0" y="116.29533678756476" />

       </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 x="635.0" y="265.0" />

         <omgdi:waypoint x="635.0" y="220.0" />

       </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="190.0" />

         <omgdi:waypoint x="835.0" y="190.0" />

       </bpmndi:BPMNEdge>

       <bpmndi:BPMNEdge bpmnElement="sid-035CCFB1-2074-409A-8ADB-13CD37A98A1E" id="BPMNEdge_sid-035CCFB1-2074-409A-8ADB-13CD37A98A1E">

         <omgdi:waypoint x="219.57539682539684" y="160.42460317460316" />

         <omgdi:waypoint x="277.0" y="160.19762845849803" />

       </bpmndi:BPMNEdge>

     </bpmndi:BPMNPlane>

   </bpmndi:BPMNDiagram>

 </definitions>

启动流程:

图-3 流程任务实例

图-4 员工一任务跟踪图

图-5 员工二任务跟踪图

图-6 主管任务跟踪图

完成员工一的任务:

  图-7 完成任务一后剩下的实例

这个时候,员工一的任务就完成了。那么,员工一只需要等待员工二完成任务,即可激活部门经理的任务了。

完成员工二任务:

图-8 部门经理流程跟踪图

图-9 员工二任务完成后实例

继续完成部门经理的任务:

图-10 完成部门经理任务后流程实例

这个时候,就剩下主管的任务,即可激活老板的任务了。

完成主管的任务:

图-11 完成主管任务后流程实例

图-11 完成主管任务后流程跟踪图

最终汇合到老板审批

完成老板的任务后,整个流程就结束了。

Activiti交流QQ群:634320089

并行网关 Parallel Gateway的更多相关文章

  1. Activity并行网关和排他网关

    说一说activiti中的排他网关和并行网关 activiti工作流中我们经常用到的网关有两种: 1. Exclusive Gateway 排他网关 排他网关.png 排他网关(也叫异或(XOR)网关 ...

  2. 包容网关 Inclusive Gateway

    包容网关 Inclusive Gateway 作者:Jesai 2018年3月25日 22:59:56 什么是包容网关? 包容网关(Inclusive Gateway)就是并行网关(Parallel ...

  3. C#并行编程-Parallel

    菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...

  4. activiti实战系列 并行网关(parallelGateWay)

    流程图 13.2:部署流程定义+启动流程实例 13.3:查询我的个人任务 13.4:完成我的个人任务 说明: 1) 一个流程中流程实例只有1个,执行对象有多个 2)  并行网关的功能是基于进入和外出的 ...

  5. bzoj 4131: 并行博弈 (parallel)

    bzoj 4131: 并行博弈 (parallel) Description lyp和ld在一个n*m的棋盘上玩翻转棋,游戏棋盘坐标假设为(x, y),1 ≤ x ≤ n,1 ≤ y ≤ m,这个游戏 ...

  6. Activiti网关--并行网关

    1.什么是并行网关 并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进 入和外出顺序流的: fork 分支: 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支. ...

  7. Activiti7 网关(并行网关)

    什么是并行网关? 并行网关允许将流程分成多条分支,也可以将多条分支合并到一起,并行网关是基于进入和外出顺序流的 fork分支: 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支 jion汇聚: ...

  8. 如何设计一个亿级网关(API Gateway)?

    1.背景 1.1 什么是API网关 API网关可以看做系统与外界联通的入口,我们可以在网关进行处理一些非业务逻辑的逻辑,比如权限验证,监控,缓存,请求路由等等. 1.2 为什么需要API网关 RPC协 ...

  9. C#并行编程--命令式数据并行(Parallel.Invoke)---与匿名函数一起理解(转载整理)

    命令式数据并行   Visual C# 2010和.NETFramework4.0提供了很多令人激动的新特性,这些特性是为应对多核处理器和多处理器的复杂性设计的.然而,因为他们包括了完整的新的特性,开 ...

随机推荐

  1. SourceYard 制作源代码包

    本文带大家走进SourceYard开发之旅 在项目开发中,将一个大的项目拆为多个小项目解耦,减少模块之间的耦合.因为如果将代码放在一起,即使有团队的约束,但只要能写出的代码就会有小伙伴写出,很快就发现 ...

  2. phpcms V9自定义分页函数

    大家做网站的时候,可能很多时候分页样式都得根据模板的要求来控制的,这时很多人都会去修改全局文件phpcms\libs\functions\global.func.php里的pages()函数,这样问题 ...

  3. centos6.5单用户模式拯救系统

    系统出现启动异常,某个软件卡住了不能启动(按Fx键可以查看是哪个软件卡住了),需要进入单用户模式或修复模式对系统进行管理. 使用单用户模式有一个前提,只要系统引导器(grub)能正常工作,否则要进行系 ...

  4. sql临时表与变量表

    1)临时表存储在 tempdb 中,当不再使用时会自动删除 一般使用如下: --创建临时表 select * into #temp from TABLE --使用临时表 select * from # ...

  5. Servlet 常用类

    Servlet 是一套标准的接口规范,当用户通过web请求来访问服务器时,由web容器根据配置调用我们实现的对应的servlet对象来提供服务.同时为了方便开发,servlet标准中也提供了许多常用的 ...

  6. Python程序执行顺序

    #示例代码基于py3.6 一直对Python程序的执行顺序有些疑惑,例如python程序是顺序执行的,那怎么还有main函数的出现呢? 在查阅了资料后,参见这里后,算是有点明白了: 1.python程 ...

  7. beta 1/2 阶段中间产物提交入口

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9918 git地址:https://e.coding.net/Eustia ...

  8. Linux三剑客之sed的基本用法介绍

    [介绍] sed是一款强大的非交互式的文本编辑器,可以对文件文本进行增删改查的相关操作,本文主要是讲解以下sed的基本用法. [常用选项] -e 下一个参数为一个sed指令,一般只会用于同一行有多个s ...

  9. html页脚固定在底部的方法

    <style type="text/css"> html { height: 100%; } body { height: 100%; margin: 0; paddi ...

  10. 「CH2101」可达性统计 解题报告

    CH2101 可达性统计 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到 ...