在 Activiti 工作流引擎中,网关(Gateway) 是用于控制流程执行路径分支、合并和同步的关键元素,它决定了流程实例在到达某个节点后,是走哪条分支,或者何时等待所有分支完成后再继续。
Activiti 支持多种类型的网关,主要可以分为以下几类:
排他网关(Exclusive Gateway)
- 符号:菱形内有一个“X”或“≠”符号。
- 含义:“二选一”或“多选一”。
- 行为:
- 当流程执行到排他网关时,会按顺序检查所有出口序列流的条件表达式。
- 只选择第一个条件为
true的路径执行。 - 如果多个条件都为
true,只走第一条匹配的路径。 - 如果没有任何条件为
true,且没有设置“默认路径”,则会抛出异常。
- 典型场景:
- 审批流程:如果金额 > 10000,走“总经理审批”;否则走“部门经理审批”。
- 状态判断:如果订单状态为“已支付”,则发货;否则不发货。
✅ 最佳实践:始终为排他网关设置一个默认路径(Default Flow),以防所有条件都不满足时流程中断。
并行网关(Parallel Gateway)
- 符号:菱形内有一条直线或无符号(取决于版本,通常是一条竖线)。
- 含义:“同时执行” + “同步等待”。
- 行为:
- 分支(Fork):当流程到达并行网关时,所有出口路径

同时启动
,互不依赖。 - 汇聚(Join):当流程从多个入口进入并行网关时,必须所有入口路径都到达,网关才会放行,继续执行后续节点。
- 分支(Fork):当流程到达并行网关时,所有出口路径
- 典型场景:
- 新员工入职:同时触发“开通邮箱”、“分配工位”、“办理门禁卡”三个任务,全部完成后才能进入“入职培训”。
- 多部门会签:多个部门并行审批,全部审批通过后流程继续。
⚠️ 注意:并行网关不评估条件,所有分支无条件执行。
包容网关(Inclusive Gateway)
- 符号:菱形内有一个圆圈(○)。
- 含义:“多选一或多选多” + “部分同步”。
- 行为:
- 分支:根据条件表达式,所有条件为
true的路径都会执行(可能多条,也可能一条)。 - 汇聚:只有实际执行过的路径需要汇聚,即:如果只有一条路径被触发,则只需等待该路径完成;如果多条路径被触发,则需等待所有这些路径完成。
- 分支:根据条件表达式,所有条件为
- 典型场景:
订单处理:根据订单内容,可能同时需要“财务审核”和“库存检查”,也可能只需要“财务审核”,无论触发几条路径,都要等所有被触发的路径完成后才继续。
💡 与排他网关的区别:排他网关只走一条;包容网关可走多条,但只关心“被触发”的路径是否完成。
事件网关(Event-based Gateway)
- 符号:菱形,内部包含一个小圆圈(事件图标)。
- 含义:“等待某个事件发生”。
- 行为:
- 流程到达事件网关后,会暂停,并监听所有出口路径上定义的事件(如消息事件、定时事件、信号事件等)。
- 第一个被触发的事件对应的路径会被激活,其他路径自动取消。
- 一旦某个路径被激活,网关立即放行,流程继续。
- 典型场景:
- 订单超时处理:设置一个定时事件(如24小时后未支付则取消订单),同时监听“用户支付”消息事件,哪个先发生,就走哪条路。
- 异常处理:等待“错误信号”或“超时信号”。
⚠️ 注意:事件网关的所有出口路径必须绑定事件接收器(如消息中间件、定时器),不能绑定普通用户任务。
复杂网关(Complex Gateway)
- Activiti 5.x 中不支持,Activiti 6/7 中已移除或简化。
- 在 BPMN 2.0 规范中,复杂网关允许使用任意布尔表达式组合来控制分支和汇聚,但 Activiti 为了简化实现,未提供完整的复杂网关支持,通常用排他+并行+包容组合替代。
对比总结表
| 网关类型 | 分支行为 | 汇聚行为 | 是否评估条件 | 典型用途 |
|---|---|---|---|---|
| 排他网关 | 只走一条路径(第一个匹配) | 单路径汇聚 | 是 | 条件分支、审批路由 |
| 并行网关 | 所有路径同时执行 | 所有路径必须完成 | 否 | 并行任务、多部门会签 |
| 包容网关 | 所有匹配路径执行 | 仅被触发的路径需完成 | 是 | 动态多路径、部分并行 |
| 事件网关 | 等待事件,第一个触发则激活 | 单路径汇聚 | 否(由事件触发) | 超时处理、事件驱动 |
使用建议
明确业务逻辑:
- 如果互斥 → 用排他网关。
- 如果必须同时完成 → 用并行网关。
- 如果可能多条路径但只需等待实际发生的 → 用包容网关。
- 如果等待外部事件 → 用事件网关。
避免死锁:
- 使用并行网关时,确保所有分支最终都能汇聚,否则流程会卡死。
- 使用包容网关时,确保汇聚条件正确,避免遗漏路径。
调试技巧:
- 在 Activiti Explorer 或 Camunda Modeler 中可视化查看网关行为。
- 检查条件表达式语法是否正确(如
${amount > 1000})。 - 查看流程实例历史,确认哪条路径被实际执行。
默认路径的重要性:
排他网关务必设置默认路径,防止因数据异常导致流程中断。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!


发表回复