Camunda并行网关实战:如何用Parallel Gateway优化多审批流程(附完整BPMN配置)
在企业流程管理中,多部门协同审批是常见场景。比如合同审批需要法务、财务、业务三方同时审核,用章申请需经过项目经理、行政主管、综合办等多环节确认。这类流程如果采用串行处理,效率会大打折扣。Camunda的Parallel Gateway(并行网关)正是解决这类问题的利器。
1. 并行网关核心原理与业务价值
并行网关在BPMN规范中属于路由元素,其核心作用是同时创建多个执行路径。与排他网关(Exclusive Gateway)不同,它不进行条件判断,而是无条件激活所有出口分支。
典型应用场景包括:
- 多部门并行审批(如采购申请需财务、法务、技术三方评审)
- 多系统同步操作(如订单创建后需同时触发库存锁定和物流调度)
- 复杂任务分解(如项目启动需并行完成合同签署、环境准备、团队组建)
技术实现上,当流程执行到并行网关时:
- 引擎会在
act_ru_execution表创建多条执行记录 - 每个分支生成独立的
act_ru_task任务记录 - 所有分支完成后才会触发后续的汇聚网关
<parallelGateway id="forkGateway" /> <sequenceFlow sourceRef="forkGateway" targetRef="task1" /> <sequenceFlow sourceRef="forkGateway" targetRef="task2" /> <sequenceFlow sourceRef="forkGateway" targetRef="task3" />2. 完整BPMN配置解析
以下是用章审批流程的完整模型(已精简非关键属性):
<bpmn:process id="seal_approval" name="用章审批流程"> <!-- 初始审批 --> <bpmn:userTask id="deptHeadApprove" name="部门主任审批"> <bpmn:outgoing>Flow_toFork</bpmn:outgoing> </bpmn:userTask> <!-- 并行网关分支 --> <bpmn:parallelGateway id="forkGateway"> <bpmn:incoming>Flow_toFork</bpmn:incoming> <bpmn:outgoing>Flow_toPM</bpmn:outgoing> <bpmn:outgoing>Flow_toAdmin</bpmn:outgoing> <bpmn:outgoing>Flow_toOffice</bpmn:outgoing> </bpmn:parallelGateway> <!-- 三个并行审批节点 --> <bpmn:userTask id="pmApprove" name="项目经理审批"/> <bpmn:userTask id="adminApprove" name="行政主管审批"/> <bpmn:userTask id="officeApprove" name="综合办审批"/> <!-- 汇聚网关 --> <bpmn:parallelGateway id="joinGateway"> <bpmn:incoming>Flow_fromPM</bpmn:incoming> <bpmn:incoming>Flow_fromAdmin</bpmn:incoming> <bpmn:incoming>Flow_fromOffice</bpmn:incoming> <bpmn:outgoing>Flow_toFinal</bpmn:outgoing> </bpmn:parallelGateway> <!-- 后续处理 --> <bpmn:userTask id="finalStep" name="用章登记"/> </bpmn:process>关键设计要点:
- 分支与汇聚网关必须成对出现
- 每个分支的
sequenceFlow不需要配置条件表达式 - 网关ID建议体现
fork/join功能区分
3. 数据库层面的执行机制
当流程到达并行网关时,观察数据库变化:
act_ru_execution表:
| ID_ | PROC_INST_ID_ | ACT_ID_ | IS_ACTIVE_ |
|---|---|---|---|
| 100 | 100 | fork | 0 |
| 101 | 100 | task1 | 1 |
| 102 | 100 | task2 | 1 |
| 103 | 100 | task3 | 1 |
act_ru_task表:
| ID_ | EXECUTION_ID_ | NAME_ | ASSIGNEE_ |
|---|---|---|---|
| 200 | 101 | 项目经理审批 | user1 |
| 201 | 102 | 行政主管审批 | user2 |
| 202 | 103 | 综合办审批 | user3 |
注意:只有当所有分支任务都完成时,引擎才会删除对应的执行记录,并激活汇聚网关后的节点。
4. 常见问题与调试技巧
问题1:流程实例卡在汇聚网关
- 检查点:
- 确认所有分支任务状态为
completed - 查询
act_ru_execution表是否存在未完成的执行分支 - 检查历史表
act_hi_taskinst是否有异常终止记录
- 确认所有分支任务状态为
问题2:并行任务未全部创建
- 可能原因:
- 网关配置错误(误用排他网关)
- 流程定义部署版本混乱
- 引擎事务未正常提交
性能优化建议:
对于高频流程,建议:
- 控制并行分支数量(通常不超过5个)
- 避免在并行分支中嵌套子流程
- 对
act_ru_task表建立合适的索引
监控关键指标:
-- 检查未完成的并行任务 SELECT COUNT(*) FROM act_ru_task WHERE PROC_DEF_ID_ = 'seal_approval:1' AND SUSPENSION_STATE_ = 1;
5. 高级应用:动态分支处理
通过Camunda的API可以实现更灵活的控制:
// 动态添加审批分支 runtimeService.createProcessInstanceModification(processInstanceId) .startBeforeActivity("additionalApprovalTask") .execute(); // 查询未完成任务 List<Task> tasks = taskService.createTaskQuery() .processInstanceId(processInstanceId) .taskDefinitionKey("pmApprove") .list();实际项目中我们曾遇到这样的案例:某次紧急用章需要额外增加安全部门审批。通过运行时动态添加分支,既满足了临时需求,又保持了流程模型的简洁性。