activiti5 工做流 自己不提供回退,按网络的说法,外国人的回退也是要在流程图设计里面画出来的,惋惜在中国各类各样的需求,确定是须要实现的。在实现回退的功能上看了网络上面的方法,都是直接修改分支表的节点ID或者经过设置节点的下节点来实现回退和跳跃等需求,惋惜都只支持单线流程,一旦有并行,包容网关,外嵌,内嵌子流程就没法成功了,还会出现不可控的错误。数据库
为了实现这些状况,只好本身实现一个CMD来作回退,先分析引擎是怎么处理并发,子流程的。经过模拟,查看表act_ru_execution,里面的IS_ACTIVE_:是否存活,IS_CONCURRENT_:是否有并发,PARENT_ID_:父节点ID,SUPER_EXEC:父分支ID出如今并发分支,出如今调用外部子流程。(这里提一点,activiti5的一个小问题,在多级并发的状况下,记录规则有所不一样,从2级开始记录的分支和1级的分支的规则不同,至于如何你们去看数据库)api
制定回退规则:先查找回退的节点,开始删除分支,根据回退节点建立分支以及任务,对子流程等几种特殊节点作处理。首先是查找回退的节点,在遍历的时候要注意子流程的状况,而后开始删除分支,在删除分支的时候注意多级并发的状况(上面说到了),直接用递归删除便可。(分支表总会保持一个主干即ID与流程实例ID相同那个,这个保留住,在这个里面作文章),最后开始建立分支,根据主干以及发现的规则建立分支和任务便可。(其中在删除任务的时候记得历史表也保存一下)
网络
在建立分支的状况分析:并发
* 处理分支,分支就是流程的指针
* 状况:
* 1.回退节点多个,聚合节点退回到并行
* 2.回退节点一个,同时有并行的运行节点,并行节点退回到聚合
* 3.内嵌子流程回退,分支要删除
* 4.回退节点是子流程,建立分支
* 5.外嵌子流程回退,子流程要删除,
* 6.回退节点是外嵌子流程
* 7.没有分支的回退,最基本
spa
根据上面的规则如今是没问题了,不过因为在开发的时候没有考虑到多实例的状况,后续再加入进去,这里只能先不回退多实例的状况。还有在操做的过程当中,不必本身写jdbc来直接操做数据库,activiti的api很丰富,特别是在cmd模式里面,不少manager可使用,彻底足够你们用了。先说到这里,代码因为是公司的项目我就不贴了。给你们一个思路。不必定是最好的,最少是中办法。设计