需求:
流程的回退是一个复杂的计算,特别是在中国式的流程里,现实中的流程则相对简单,如我把一个审批文件提交出去后,若由两我的(张3、李四)同时处理,若张 三或李四须要把文件退回来,文件直接打回到发起人我这里,这样张三或李四手上再也不存在审批文件,但对于JBPM或Activiti的流程回退则作不到这么 简单。
但原则上咱们要符合这种现实的要求:流程由谁提交过来,则退回给谁。
为了弄清这个关系,咱们以一个稍为复杂一点Activiti流程为例。html
以上流程包括了多种流程节点,如分支,并行节点,多实例任务,子流程。流程执行过程当中咱们记录其任务完成的每一个一步,而后概括其回退的算法实现。其中,A为多实例任务,咱们在后台指定了其两个执行用户,咱们启动流程,而后记录每一步执行的状况。算法
流程产生后,产生任务如:数据结构
当A的两个实例任务完成后,将会产生后续的任务,即产生B、C、E任务,在这三任务中,若回退的话,均是回退至A,而且是由A原来的执行人员来处 理。因为A是多实例任务,其执行的任务个数为动态,若当时执行数为2(而且为张3、李四)两人处理,则回退后,也是回到这两我的那里处理。以下所示:htm
而另外,E回退时,也须要B、C的任务删除(在某种状况下也可能不删除),现实中至关于我把任务完成后,同时提交给三我的去处理,其中一我的回退,不能把另外一个任务的工做也回退回来处理。
在B点上回退,C须要销毁,E也存在的话,也不合理,由于在A再往下执行时,又会从新产生B、C、E,所以,为了减小复杂度,须要所有删除B、C、E,回退至A。
当E往下执行时,会产生F或G任务,在这里咱们设置条件让他产生F任务,如:
图片
若F回退,则应该产生E任务,B、C则正常运行,继续往下执行后,将会产生I任务,再者是J任务。若在I任务回退,则应该回退至F。
同理,若B与C执行完成后,将会产生D。若咱们记录任务的产生顺序,将比较容易实现任务的回退,因为jbpm4或activiti5均不记录这种操做,因此要实现回退均比较困难。
在此咱们用一个有效的数据结构记录全部的任务产生的顺序,以下所示:get
有了这样的一个数据结构,记录了每一个任务节点的产生顺序,咱们在任何一个节点上,都能有效回退至上一任务节点,而且包括自由跳转的方式,如在I节点,若咱们回退至E,就把F节点从这个记录顺序中去掉,而后产生E任务出来。
这里还有一些问题尚没有获得有效解决:
1.如D任务回退时,应该产生B与C任务的仍是仅须要产生其中一个,系统中是提供人工选择的方式给他仍是自动产生其中一个?it
2.F回退至E时,要不要也产生B、C任务?后台
3.任务回退时,须要找回原来的执行人并行
4.这个任务堆栈执行记录在何时往里放数据,即产生这个执行树im
演示请看:
http://www.jee-soft.cn/htsite/html/cpjfw/zxjc/bpmx3/2012/07/10/1341909594877.html