浅谈jbpm流程收回和回退的控制方法(一)
在我们做流程项目时,总会有一种情况是流程已经跑到后面了,但客户要求我要从某某任务开始重走,而且还是要求从什么地方都可以重走.如果你要是按jbpm的思路做,就要到处划线,最后流程图是乱七八糟,(当然你客户不看流程图就没问题,呵呵).
很多了解jbpm工作原理的人都知道要想让流程回到以前的一个任务重新开始,需要控制任务开启与关闭,还有就是要控制令牌的指向的节点.其实在实际应用中要跟复杂一些比如,要将流程回退到一个分支中,或从一个分支回到到分支开始之前任务上.从子流程回退到主流程中,从子流程回到前面的一个子流程中......(&%#$*? 更复杂的我就不说,用的比较少了).对于以上情况我们会逐个讨论.
今天可以先讨论一下最简单的情况,先做个假设有流程 a-->b-->c-->d-->e.当前流程已经跑到d,如果要回到b重新跑怎么做那.步骤就是我们上面提到:
一,关闭任务b后创建的并且没有关闭的任务(与任务b同在一个节点上没有完成的任务除外)
二,开启任务b.
三,将令牌指向任务b所在的节点.
如何开关一个任务 :任务实例TaskInstance有三个重要的属性end(任务结束时间),isOpen(任务是否开启),isSignalling(任务是否可流转).控制这3个属性就可以控制任务实例.如果要开启一个任务,就让end=null.isOpen=true,isSignalling=true.如果要关闭一个任务就是end=new Date().isOpen=false,isSignalling=false.另外还有一个属性isCancelled,如果你关闭的任务作废了,不需要作为历史任务保留,就让isCancelled=true;
如何控制令牌的指向 :
当前令牌保存的是任务d所在节点的节点Id,因为你要从任务b开始重新走流程,所以应该将任务b所在节点的id装入令牌中:
Node node = taskInstance.getTask().getTaskNode();//取任务b所在节点 if (node == null) { node = taskInstance.getTask().getStartState();//有可能是要退到头的 } taskInstance.getToken().setNode(node);
这样就ok了,不过这样只能处理简单的回退,当涉及到分支,子流程事时不成的(这个下次再说),开启和关闭任务的3个属性有的是没有set方法的,需要写sql,hql.
最后说一下我这里回退的业务逻辑,回退操作每次只能开启一个历史任务,该任务之后创建的任务全部作废(end=null.isOpen=true,isSignalling=true,isCancelled=true),但如果有属同一节点上的任务且未完成.就不作废了.
今天就说到这吧,下次讨论一下含分支的处理逻辑.