activiti中的网关用来处理流程中出现分支的情况,常见的网关类型有排他网关,并行网关,兼容网关,事件网关

一、排他网关

排他网关的每个出口线条上都要写上条件,流程从网关往出走的时候会根据条件选择走那条线,并且只会走一条线

排他网关定义的时候是这样的。

<exclusiveGateway id="sid-80E3E804-DD32-4639-9FFA-A3565600BB94"></exclusiveGateway>

它的出口两个线条上要写上条件表达式

<sequenceFlow id="sid-937127D2-6E04-473F-8197-3307C97731E0" sourceRef="sid-80E3E804-DD32-4639-9FFA-A3565600BB94" targetRef="userTask1">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${days>5}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-9975AB4C-1068-452A-AECB-D0B588FABB3E" sourceRef="sid-80E3E804-DD32-4639-9FFA-A3565600BB94" targetRef="userTask2">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${days<=5}]]></conditionExpression>
    </sequenceFlow>

上边的流程启动的时候需要传days,根据days决定流程的走向,并且只会有一个执行流

二、并行网关

并行网关的出口线条上不需要写条件,写了条件也会被忽略。并行网关可以用来把一个执行流拆分成多个执行流,处理像会签这样的业务,也可以把多个执行流合并成一个。

所以并行网关对执行流有两种行为,分叉(fork)合并(join)。需要注意的是同一个并行网关可以同时出现分叉和合并两种行为,并行网关会先将这些执行流合并,然后再进行分叉。

以下是一个使用并行网关的例子

一个流程需要三个人都审批完成才能结束,就可以使用并行网关完成,左边的网关把执行流拆分成3个执行流,右边的网关把三个执行流合并成一个。

启动这个流程,流程会到达apply节点,apply节点处理完后到达并行网关,执行流被拆分成三个执行流

81918是原来的执行流,它停在gateway1节点,剩下的三个是新生成的子执行流,三个执行流对应了三个任务,parentid是81918。

当这三个任务都完成后流程到达并行网关完后被合成成一个流程然后结束。

并行网关在流程文件中使用parallelGateway元素来定义

<parallelGateway id="gateway1"></parallelGateway>

三、兼容网关

兼容网关同时有排他网关和并行网关的特性,可以为兼容网关的输出顺序流定义条件,如果其中某个顺序流条件符合就会创建一个新的执行流。与排他网关不同的是如果多个出口线条的条件同时成立兼容网关可以向并行网关一样创建多个执行流。

上边这流程在usertask1的入口线条上有 days>5的条件;在usertask2的入口线条上有money>100的条件,

启动流程的时候需要传递这两个流程变量。如果只有一个条件成立整个流程中就只有一个执行流,如果两个条件都成立,在经过网关1后就会有1个主执行流和两个子执行流。

两个任务都审批完成后通过网关2把执行流合并然后结束。

兼容网关在流程文件中是通过inclusiveGateway元素定义的

<inclusiveGateway id="gateway1"></inclusiveGateway>

四、事件网关

事件网关根据中间catching事件来决定流程的走向。

上边的流程中事件网关会根据两个中间catching事件哪个先发生来决定流程到底走哪个分支。