Camunda 7.19多实例子流程并行调度与终止问题求助
Camunda 7.19 多轮并行Review任务流程解决方案
问题背景
基于Camunda 7.19构建业务流程,核心需求与现有设计如下:
- 任务需经多人多轮Review Task,直至完成最终决策后进入Decisioned Case子流程
- 现有流程逻辑:
- 通过决策表与Service Task确定需调度的后续任务列表
- 用多实例子流程
Perform Next Task调度该列表中的任务 - 任一Review Task完成决策后,流程需返回父流程继续执行;最终决策任务完成时,终止其余未完成任务并进入决策子流程
当前问题:虽能同时调度多个Review Task,但必须等所有调度任务完成后才会回到父流程的决策网关,无法实现任一任务完成即触发父流程继续执行的需求。
当前行为
Review Task A (completed [B & C should be next]) |_ Review Task B (Scheduled) |_ Review Task C (Scheduled) Review Task C (Completes [D should be Next, along with whatever from before]) |_ Only Review Task B (Scheduled) Review Task B (Completed [Y should be Next, along with whatever from before]) |_ Only Task Y (Scheduled) Review Task Y (Completed with case Decisioned) |_ Decisioned Case sub-process Starts
期望行为
Review Task A (completed [B & C should be next]) |_ Review Task B (Scheduled) |_ Review Task C (Scheduled) Review Task C (Completes [D should be Next, along with whatever from before]) |_ Review Task B (Scheduled) |_ Review Task D (Scheduled) Review Task B (Completed [Y should be Next, along with whatever from before]) |_ Review Task D (Scheduled) |_ Review Task Y (Scheduled) Review Task Y (Completed with case Decisioned) |_ Review Task D (Canceled) |_ Decisioned Case sub-process Starts
核心诉求
- 并行运行的子流程中,任一任务完成决策后立即返回父流程继续执行,保留未完成任务
- 最终决策任务完成时,终止所有其余未完成任务,直接进入Decisioned Case子流程
解决方案
针对Camunda 7.19的特性,可通过以下配置实现需求:
1. 调整多实例子流程的完成模式
将多实例子流程Perform Next Task的完成条件设置为false,同时开启异步执行(Async Before/After):
- 默认多实例需所有实例完成才触发父流程,设置完成条件为
false后,单个实例完成就会触发后续流程逻辑 - 异步执行避免流程阻塞,确保单个任务完成后父流程能立即响应
2. 用事件子流程捕获任务完成信号
在父流程中添加事件子流程,通过Signal Event捕获Review Task完成的信号:
- 每个Review Task完成时,触发自定义信号(比如
reviewTaskCompleted) - 事件子流程接收信号后,执行决策表与Service Task生成新的任务列表,再调度新的多实例任务
- 注意:信号需配置为针对当前流程实例,避免干扰其他流程
3. 标记最终决策任务并终止剩余任务
当Review Task是最终决策任务时,在任务完成逻辑中添加以下操作:
- 通过流程变量标记当前任务是否为最终决策任务(比如
isFinalDecision: true),任务完成时读取该变量判断逻辑 - 调用Camunda API终止所有未完成的
Perform Next Task子流程实例 - 直接跳转至Decisioned Case子流程
4. 用网关控制流程分支
在父流程中添加并行网关,分别处理两个分支:
- 持续接收Review Task完成信号并生成新任务的分支
- 最终决策任务触发后进入Decisioned Case子流程的分支
- 通过排他网关判断是否已触发最终决策,避免新任务继续生成
关键代码示例
任务完成时触发信号
// 在Review Task的Delegate类中触发信号 runtimeService.createSignalEvent("reviewTaskCompleted") .processInstanceId(processInstanceId) .setVariables(completedTaskVariables) // 传递任务决策信息 .send();
终止未完成子流程实例
// 查询当前父流程下所有活跃的Perform Next Task子流程 List<ProcessInstance> activeSubInstances = runtimeService.createProcessInstanceQuery() .superProcessInstanceId(processInstanceId) .processDefinitionKey("performNextTaskSubProcess") .active() .list(); // 逐个终止子流程 for (ProcessInstance subInstance : activeSubInstances) { runtimeService.deleteProcessInstance(subInstance.getId(), "Final decision made, cancel remaining reviews"); }
注意事项
- 需确保流程变量的一致性,避免多任务并行更新变量导致冲突
- 信号事件需绑定当前流程实例ID,防止跨流程干扰
- 异步执行的任务需配置合理的事务边界,避免数据不一致
内容的提问来源于stack exchange,提问作者Saher
相关产品推荐
相关产品推荐

