Activiti BPM中并行任务完成一个时如何取消另一任务继续流程
问题根因
排他网关(Exclusive Gateway)本身不具备取消并行执行分支的能力,如果你直接将两个并行任务接入排他网关,流程引擎默认会等待所有进入网关的执行流全部抵达后才会做路由判断,这就是为什么必须等两个任务全部完成才会向后流转。要实现「任意一个并行用户任务完成即推进流程、自动取消剩余未完成任务」的效果,不能用普通并行网关+排他网关的组合,以下是两种可直接落地的实现方案。
方案1:包容网关方案(配置最简单,适配绝大多数场景)
这是Activiti BPMN2规范里原生支持的“竞态分支”实现方式,不需要写额外代码:
- 将原来拆分并行分支的入口并行网关,替换为包容网关(Inclusive Gateway),网关的两个流出流分别连接两个并行的User Task,两个流出流不需要设置判断条件,直接标记为默认流即可,保证流程启动时两个用户任务会同时生成待办
- 两个User Task的流出流全部汇总到第二个包容网关作为合并节点,确认该合并网关的
cancelRemainingInstances属性为true(Activiti中该属性默认值为true,无需额外修改,只要确认没有被手动置为false即可) - 合并包容网关的流出流直接连接后续流程节点即可
- 实现逻辑:当任意一个User Task完成、执行流抵达合并包容网关时,引擎会自动校验流转条件,直接删除当前并行分支上未完成的剩余活动(即未完成的另一个User Task),直接向后流转,不会等待剩余分支执行。
注意:绝对不能用普通并行网关做合并节点,并行网关的原生逻辑是必须等待所有进入流全部抵达才会触发流转,不支持自动取消剩余分支实例,是这类需求最常见的配置错误。
方案2:边界终止事件方案(适合取消任务时需触发额外逻辑的场景)
如果你需要在取消未完成任务的同时,触发消息通知、操作日志记录这类自定义逻辑,可以用边界事件方案:
- 用普通并行网关拆分出两个并行User Task,两个任务的流出流直接汇合到后续流程节点,不需要额外加排他网关
- 给两个User Task分别挂载
cancelActivity=true的边界终止事件,同时在当前子流程作用域配置信号监听 - 实现逻辑:当任意一个User Task完成时,引擎会在推进流程到后续节点的同时,向当前子流程范围广播终止信号,自动将同作用域下未完成的另一个User Task标记为已删除,不会残留待办,你可以在边界事件的执行监听器里挂载自定义的业务逻辑。
配置避坑提示
- 不要在并行任务和合并网关之间加会阻塞执行流的执行监听器,否则会导致引擎识别剩余分支实例失败,无法自动取消未完成任务
- 如果该逻辑配置在嵌入子流程内,不要把子流程的
isAsync属性和用户任务的异步配置冲突,避免取消任务的动作出现异步延迟
内容的提问来源于stack exchange,提问作者priyam
相关产品推荐
相关产品推荐

