浅谈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),但如果有属同一节点上的任务且未完成.就不作废了.

       今天就说到这吧,下次讨论一下含分支的处理逻辑.

 

原文:http://xint13.javaeye.com/blog/214963

posted @ 2010-12-15 10:31  Me疯子_(~  阅读(1038)  评论(0编辑  收藏  举报