`
hudixin1987
  • 浏览: 14992 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

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;

这些TaskInstance 类是不提供方法来设置的

我们就需要手动的通过sql语句来更新这个任务

update JBPM_TASKINSTANCE set ISOPEN_=1,ISSIGNALLING_=1,END_= null where ......

如何控制令牌的指向 :当前令牌保存的是任务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),但如果有属同一节点上的任务且未完成.就不作废了.

同上jbpm 也是不提供直接调用的方法所以 还是要通过sql语句来完成

update JBPM_TOKEN set NODE_ =? where ID_ = ?

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics