Flowable-网关-排他网关

✨✨✨ 最好用的Flowable流程设计器


定义

排他网关,也叫异或(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&gt;10000}</conditionExpression>
    </sequenceFlow>
  </process>

在以上代码中,加粗代码定义了排他网关 Gateway_1gse3sj,它流出的条件顺序流有
Flow_1gdshzv、Flow_0mdfhgf,分别定义了条件 默认流、Flow_0mdfhgf。

视频教程

排他网关

演示demo

排他网关

本文中内容和案例出自贺波老师的书《深入Activiti流程引擎:核心原理与高阶实战》,书中的介绍更全面、详细,推荐给大家。
深入Activiti流程引擎

### JeecgBoot框架中的排他网关使用教程 在JeecgBoot框架中,排他网关(Exclusive Gateway)用于基于条件判断流程走向。当到达排他网关时,只会选择一条满足条件的路径继续执行[^2]。 #### 配置排他网关 为了配置排他网关,在BPMN文件中定义`<exclusiveGateway>`标签: ```xml <bpmn:exclusiveGateway id=" exclusiveGateway1 " name=" Exclusive Gateway "/> ``` 此标签表示一个排他网关节点。通过设置属性`default`可以指定默认流出顺序流ID,如果没有任何条件表达式求值为true,则会走这条默认路径。 #### 设置条件表达式 对于每条从排他网关出发到下一个活动之间的连线,需为其设定条件表达式来决定是否沿该线前进。这通常是在连接线上添加`${expression}`形式的布尔表达式完成: ```xml <sequenceFlow id="flow4" sourceRef="exclusiveGwId" targetRef="nextTask"> <conditionExpression xsi:type="tFormalExpression">${someCondition}</conditionExpression> </sequenceFlow> ``` 这里`sourceRef`指向源网关元素ID而`targetRef`指向下一站任务或子流程等目标元素;`conditionExpression`内的逻辑决定了当前分支能否被激活。 #### 实际案例应用 假设存在审批工作流场景下有经理和主管两个角色分别对应不同金额范围内的申请处理权限。此时可以在模型设计阶段利用排他网关实现自动化路由决策: ```xml <exclusiveGateway id="checkAmount" name="Check Amount"/> ... <!-- 经理审批 --> <sequenceFlow id="toManagerApproval" sourceRef="checkAmount" targetRef="managerApproveTask"> <conditionExpression xsi:type="tFormalExpression">${amount >= 5000}</conditionExpression> </sequenceFlow> <!-- 主管审批 --> <sequenceFlow id="toSupervisorApproval" sourceRef="checkAmount" targetRef="supervisorApproveTask"> <conditionExpression xsi:type="tFormalExpression">${amount < 5000}</conditionExpression> </sequenceFlow> ``` 上述例子展示了如何根据不同数值区间分配给不同的审核人员负责相应级别的请求审查过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小学生05101

flowable

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

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

打赏作者

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

抵扣说明:

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

余额充值