一、Bug描述
使用7.0.1版本的 moveActivityIdsToSingleActivityId 或 moveExecutionsToSingleActivityId实现节点跳转,程序不会报错,但是act_ru_task 没有生成新的任务,导致流程中断,这是相当严重的bug。
经过多次测试,发现单实例没问题,如果是多实例就会产生上边说的问题,导致流程中断
runtimeService.createChangeActivityStateBuilder()
.processInstanceId(processInstanceId)
.moveActivityIdsToSingleActivityId("当前的任务的节点id", "需要跳转的目标节点")
.changeState();
runtimeService.createChangeActivityStateBuilder()
.processInstanceId(processInstanceId)
.moveExecutionsToSingleActivityId(realExecutionIds,
targetRealActivityId).changeState();
二、问题复现
1、退回发起人节点
从审核人2退回发起人,经过测试发现退到发起人是没有问题的。
2、其他节点退回非发起人节点
从审核人2退回审核人1或审核人3退回审核人1或审核人2,测试发现,会产生流程中断,退回后的节点没有产生新任务,经过断点发现没有调用获取人员的UEL表达式,如下图所示
三、解决方案
1、退回低版本
7.0.1 -->7.0.0.M1
6.8.1-->6.8.0
2、修改源代码
调用退回api的时候,会调用
org.flowable.engine.impl.dynamic.AbstractDynamicStateManager的createEmbeddedSubProcessAndExecutions 方法
本地代码创建和源码完全同包名、同方法名的类,将低版本的6.8.0或6.7.2版本中的
createEmbeddedSubProcessAndExecutions方法的实现替换掉高版的实现即可。
四、总结
github 上issue也有好几人人遇到该问题,https://github.com/flowable/flowable-engine/issues/3944
但是官方还没推出该bug的解决方案,建议还是先降低版本,最方便也最省事,等官方解决了可以再切回来。