关于flowable的回退至任意节点

563 阅读1分钟

使用flowable流程引擎的朋友应该都了解,官方对于回退操作,实际是通过ChangeActivityStateBuilder这里提供的方法去实现的。简单观察可知,ChangeActivity操作包含1>1,1>n,n>1几种形式。 image.png

flowable回退至任意节点的做法。

1.寻找真实操作节点。(排除skip节点) 比较简单,暂不多述。

2.寻找执行实例列表,进行moveExecutionsToSingleActivityId进行回退。 此处存在隐患:当从6返回至4.1时。由于只重新激活了4.1。 当4.1执行complete后,会发现流程没有正在执行的节点。但网关节点存在执行实例。由于源码判断网关执行实例数不满足通过条件,导致整个流程异常卡住。

image.png 解决思路 通过AbstractFlowableEngineEventListener,监听任务完成事件。查询库表判断是否存在异常网关(存在执行实例,但runtask表不存在该网关的前序节点)。 存在异常网关时,通过伪造网关前序丢失节点task数据,并执行taskcomplete操作,自动补充实例。从而实现异常网关的自动通过。

一部分细节点

  1. 当异常网关需要补充多个伪前序任务时,先判断出其中最靠前的任务,优先执行。
  2. 以下场景的回退后的审批完成,并不存在异常网关,借鉴单例的实现方式,进行二次检测补偿。(缺点:耗时行为可能导致中间态出现,补偿过后会消失。)
  3. 鉴于实际流程的复杂性,在部分场景中,还需要二次检测,避免遗漏。

image.png