在流程建模的时候,定义好了返回的线路,这种严格来说,不是回退流。例如,审核不通过,则返回重新填写,这种只是条件路由。
工作流的回退流,是流程实例在流转的过程中,可以回退到运行轨迹的任意步骤,同时还可以辅助一些业务补偿方法,使得回退时候的环境和原来执行时候的环境一样。
所以回退流,和流程引擎支持的正常的路由方式是不一样的,甚至是反流程建模的方式,流程建模就是把业务流程的各业务处理过程按一定的流转方式建立起关联。而回退流,是没有规律的,当流转到一定的步骤后,可以回退到任意的步骤。
当流程的流转方式为顺序流的时候,处理回退很简单:
顺序流:
当运行到最后一个步骤时,可以选择 回退到 前面的任意步骤。而不是按照流程定义的方式,接着往下执行。
实现过程:关闭当前执行的步骤--》转入历史步骤--》指定回退的步骤为当前可执行的步骤--》生成指定回退步骤的任务--》辅助执行业务补偿类(可选的)
条件路由:
实现过程:和顺序流的处理类似,当需要回退的时候,关闭当前的可执行步骤--》送入历史步骤--》建立回退到的步骤为当前可执行步骤--》生成指定回退步骤的任务--》辅助执行业务补偿类(可选的)
分支路由:
上一篇文章主要讲了分支和聚合,分支包含静态分支和动态分支,都是同时产生并发的分支线路。静态分支用静态聚合来汇聚,动态分支用动态聚合来汇聚。按正常的流转方式,静态分支和动态分支,按照流程建模时候的路由方式,继续向前流转。但是如果选择回退,回退的处理就和顺序流等不一样,回退到分支上,回退到主干上,处理过程会不同。
单层的分支:
当流转到分支节点,产生并发的分支时
分支--回退到--分支,处理过程:关闭当前分支节点--》转入历史步骤--》回退到的分支节点步骤为当前可执行步骤--》生成指定回退到的步骤的任务--》辅助执行业务补偿类(可选)
其它的分支不受影响。
分支--回退到--主干,处理过程:关闭所有分支上的当前步骤--》转入历史步骤--》回退到的主干节点步骤为当前可执行步骤--》生成指定回退到的步骤的任务--》辅助执行业务补偿类(可选)。
所有分支都被关闭,回退到主干节点上。
主干--》回退到--分支,处理过程:关闭当前主干上的当前步骤--》转入历史步骤--》回退到的分支节点步骤为当前可执行步骤--》生成指定回退到的步骤的任务--》辅助执行业务补偿类(可选)
只生成回退到的分支节点为当前可执行步骤,其它并行节点不生成,当此分支执行完成,汇聚的时候,配合其它分支节点的历史步骤的执行情况,来满足汇聚的条件。就如只有此回退到的分支需要重新执行一次,其它的分支不用重新执行。
多层的分支:
当有分支嵌套的时候,回退的处理又更加复杂
单层的分支--回退到--本分支,处理过程,同上面单层分支--分支。其它的分支均不受影响,只在本分支上面回退。
单层的分支--回退到--上层分支的主干,处理过程:
递归出上层分支的所有下级分支节点
||
关闭这些节点的所有当前步骤
||
送入历史步骤
||
生成回退到的上层分支主干的节点为当前步骤
||
生成指定回退到步骤的任务
||
辅助执行业务补偿类(可选)
任意分支--回退到--主干,处理过程:关闭所有的多层分支的当前步骤--》送入历史步骤--》回退到的主干节点步骤 为当前步骤--》生成指定步骤的任务--》辅助执行业务补偿(可选)
这种回退处理比较清晰,关闭掉所有并行的一级分支,二级分支等等。
上层分支的主干--回退到--任意分支步骤:
关闭分支主干上的当前步骤--》送入历史步骤--》生成回退到的分支节点步骤为当前步骤--》生成回退步骤的任务--》辅助业务补偿(可选)
其它并发分支线不受影响。
主干--回退到--分页分支:
只生成回退到的分支节点
处理过程:关闭主干节点的当前步骤--》送入历史步骤--》生成回退到的分支节点为当前步骤--》生成回退到步骤的任务--》辅助业务补偿(可选)
其它分支线不受影响,取其它分支的历史步骤 和 当前分支 步骤 匹配 汇聚节点的条件。就如同某分支需要重做,其它分支不需要重新处理。