Camunda并行网关实战如何用Parallel Gateway优化多审批流程附完整BPMN配置在企业流程管理中多部门协同审批是常见场景。比如合同审批需要法务、财务、业务三方同时审核用章申请需经过项目经理、行政主管、综合办等多环节确认。这类流程如果采用串行处理效率会大打折扣。Camunda的Parallel Gateway并行网关正是解决这类问题的利器。1. 并行网关核心原理与业务价值并行网关在BPMN规范中属于路由元素其核心作用是同时创建多个执行路径。与排他网关Exclusive Gateway不同它不进行条件判断而是无条件激活所有出口分支。典型应用场景包括多部门并行审批如采购申请需财务、法务、技术三方评审多系统同步操作如订单创建后需同时触发库存锁定和物流调度复杂任务分解如项目启动需并行完成合同签署、环境准备、团队组建技术实现上当流程执行到并行网关时引擎会在act_ru_execution表创建多条执行记录每个分支生成独立的act_ru_task任务记录所有分支完成后才会触发后续的汇聚网关parallelGateway idforkGateway / sequenceFlow sourceRefforkGateway targetReftask1 / sequenceFlow sourceRefforkGateway targetReftask2 / sequenceFlow sourceRefforkGateway targetReftask3 /2. 完整BPMN配置解析以下是用章审批流程的完整模型已精简非关键属性bpmn:process idseal_approval name用章审批流程 !-- 初始审批 -- bpmn:userTask iddeptHeadApprove name部门主任审批 bpmn:outgoingFlow_toFork/bpmn:outgoing /bpmn:userTask !-- 并行网关分支 -- bpmn:parallelGateway idforkGateway bpmn:incomingFlow_toFork/bpmn:incoming bpmn:outgoingFlow_toPM/bpmn:outgoing bpmn:outgoingFlow_toAdmin/bpmn:outgoing bpmn:outgoingFlow_toOffice/bpmn:outgoing /bpmn:parallelGateway !-- 三个并行审批节点 -- bpmn:userTask idpmApprove name项目经理审批/ bpmn:userTask idadminApprove name行政主管审批/ bpmn:userTask idofficeApprove name综合办审批/ !-- 汇聚网关 -- bpmn:parallelGateway idjoinGateway bpmn:incomingFlow_fromPM/bpmn:incoming bpmn:incomingFlow_fromAdmin/bpmn:incoming bpmn:incomingFlow_fromOffice/bpmn:incoming bpmn:outgoingFlow_toFinal/bpmn:outgoing /bpmn:parallelGateway !-- 后续处理 -- bpmn:userTask idfinalStep name用章登记/ /bpmn:process关键设计要点分支与汇聚网关必须成对出现每个分支的sequenceFlow不需要配置条件表达式网关ID建议体现fork/join功能区分3. 数据库层面的执行机制当流程到达并行网关时观察数据库变化act_ru_execution表ID_PROC_INST_ID_ACT_ID_IS_ACTIVE_100100fork0101100task11102100task21103100task31act_ru_task表ID_EXECUTION_ID_NAME_ASSIGNEE_200101项目经理审批user1201102行政主管审批user2202103综合办审批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(); // 查询未完成任务 ListTask tasks taskService.createTaskQuery() .processInstanceId(processInstanceId) .taskDefinitionKey(pmApprove) .list();实际项目中我们曾遇到这样的案例某次紧急用章需要额外增加安全部门审批。通过运行时动态添加分支既满足了临时需求又保持了流程模型的简洁性。