使用flowable流程引擎的朋友应该都了解,官方对于回退操作,实际是通过ChangeActivityStateBuilder这里提供的方法去实现的。简单观察可知,ChangeActivity操作包含1>1,1>n,n>1几种形式。
flowable回退至任意节点的做法。
1.寻找真实操作节点。(排除skip节点) 比较简单,暂不多述。
2.寻找执行实例列表,进行moveExecutionsToSingleActivityId进行回退。 此处存在隐患:当从6返回至4.1时。由于只重新激活了4.1。 当4.1执行complete后,会发现流程没有正在执行的节点。但网关节点存在执行实例。由于源码判断网关执行实例数不满足通过条件,导致整个流程异常卡住。
解决思路
通过AbstractFlowableEngineEventListener,监听任务完成事件。查询库表判断是否存在异常网关(存在执行实例,但runtask表不存在该网关的前序节点)。
存在异常网关时,通过伪造网关前序丢失节点task数据,并执行taskcomplete操作,自动补充实例。从而实现异常网关的自动通过。
一部分细节点
- 当异常网关需要补充多个伪前序任务时,先判断出其中最靠前的任务,优先执行。
- 以下场景的回退后的审批完成,并不存在异常网关,借鉴单例的实现方式,进行二次检测补偿。(缺点:耗时行为可能导致中间态出现,补偿过后会消失。)
- 鉴于实际流程的复杂性,在部分场景中,还需要二次检测,避免遗漏。