目录
- 定义
- 图形标记
- XML内容
- 示例
- 视频教程
定义
排他网关,也叫异或(XOR)网关,是 BPMN 中使用的最常见的网关之一,用来在流转中实
现发散分支决策。排他网关需要和条件顺序流搭配使用,当流程执行到排他网关,所有流出的顺序
流都会被按顺序求解计算一遍,其中第一个条件解析为 true 的顺序流会被选中(当多个顺序流程的
条件为 true 时,只有第一个会被选中)并且不再计算其它流出分支,让流程沿着第一条被选中的执
行线运行;如果所有顺序流条件计算结果都为 false 且该网关定义了一个默认顺序流,那么该默认
顺序流将被执行;如果所有顺序流条件计算结果都为 false 且没有定义默认顺序流,则抛出异常,
中断执行,在流程设计时应该避免这种情况的发生,至少需要确保有一条分支的顺序流计算结果为true。
排他网关的流程分支的顺序流建议配置条件,未设置条件的顺序流被计算为 true。
排他网关没有合并的效果,只要有一个流入的顺序流到达,该网关流出的顺序流被激活开始执
行计算。如果前置可能会有多个正在执行的分支,排他网关之后的路径将在每个分支到达时被重复
实例化(除非业务需求的确如此,否则应避免这种情况的发生)。
图形标记
排他网关用内部带有“X”图标的标准网关(菱形)表示,“X”图标表示异或(XOR)语义。
排他网关的图形标志如图所示。
XML内容
排他网关用一行定义了网关,条件表达式定义在流出顺序流中:
<exclusiveGateway id="Gateway_1gse3sj" default="Flow_1gdshzv"/>
示例
<process id="ServiceSpringCloudBackServiceProcess" name="服务-Springcloud回调服务" isExecutable="true">
<startEvent id="a39b8c7712bb742a7aa081cf731563c96" />
<userTask id="ad7ca5657f18f4e64aa6e309db12fc47b" name="费用申请">
<extensionElements>
<flowable:formData />
<flowable:assigneeType>static</flowable:assigneeType>
</extensionElements>
<outgoing>Flow_0tmo406</outgoing>
</userTask>
<sequenceFlow id="a653af6d1d2774d02afc0301d2f0121e2" sourceRef="a39b8c7712bb742a7aa081cf731563c96" targetRef="ad7ca5657f18f4e64aa6e309db12fc47b" />
<endEvent id="Event_1vogsar">
<incoming>Flow_0odeyuq</incoming>
</endEvent>
<exclusiveGateway id="Gateway_1gse3sj" default="Flow_1gdshzv">
<incoming>Flow_0tmo406</incoming>
<outgoing>Flow_1gdshzv</outgoing>
<outgoing>Flow_0mdfhgf</outgoing>
</exclusiveGateway>
<userTask id="Activity_0b7092y" name="经理">
<extensionElements>
<flowable:formData />
<flowable:assigneeType>static</flowable:assigneeType>
</extensionElements>
<incoming>Flow_1gdshzv</incoming>
<outgoing>Flow_0c58ztv</outgoing>
</userTask>
<userTask id="Activity_1gvbrzi" name="总监">
<extensionElements>
<flowable:formData />
<flowable:assigneeType>static</flowable:assigneeType>
</extensionElements>
<incoming>Flow_0c58ztv</incoming>
<incoming>Flow_0mdfhgf</incoming>
<outgoing>Flow_0ovnf34</outgoing>
</userTask>
<sequenceFlow id="Flow_0c58ztv" sourceRef="Activity_0b7092y" targetRef="Activity_1gvbrzi" />
<userTask id="Activity_0ol5zjn" name="总经理">
<extensionElements>
<flowable:formData />
<flowable:assigneeType>static</flowable:assigneeType>
</extensionElements>
<incoming>Flow_0ovnf34</incoming>
<outgoing>Flow_0odeyuq</outgoing>
</userTask>
<sequenceFlow id="Flow_0ovnf34" sourceRef="Activity_1gvbrzi" targetRef="Activity_0ol5zjn" />
<sequenceFlow id="Flow_0odeyuq" sourceRef="Activity_0ol5zjn" targetRef="Event_1vogsar" />
<sequenceFlow id="Flow_0tmo406" sourceRef="ad7ca5657f18f4e64aa6e309db12fc47b" targetRef="Gateway_1gse3sj" />
<sequenceFlow id="Flow_1gdshzv" sourceRef="Gateway_1gse3sj" targetRef="Activity_0b7092y" />
<sequenceFlow id="Flow_0mdfhgf" name="大于10000" sourceRef="Gateway_1gse3sj" targetRef="Activity_1gvbrzi">
<conditionExpression xsi:type="tFormalExpression">${money>10000}</conditionExpression>
</sequenceFlow>
</process>
在以上代码中,加粗代码定义了排他网关 Gateway_1gse3sj,它流出的条件顺序流有
Flow_1gdshzv、Flow_0mdfhgf,分别定义了条件 默认流、Flow_0mdfhgf。
视频教程
排他网关