这里仅讨论通过action动态创建task来实现的方式。

决定会签的方式主要是通过task-node的signal属性来决定的。

  1. 会签中,一个人reject,则结束会签,退回起草人;全部通过,则流到下一个node。
  2. 会签中,等待所有的人完成会签任务,然后根据会签人的意见(即所选的transition),来决定流程流向哪个node。

第一种情况,signal="last-wait",只要一个人拒绝,则系统需要将其他没有完成的任务完成掉,在完成时需要以拒绝的那个transition来做end,具体可以参考 http://tomkoo.javaeye.com/blog/24690  ,里面有很清楚的代码及解释。

第二种情况, signal="never",这种情况正是我现在需要解决的。以前一直没有空来测试。今天看了一下signal的说面,突然来了灵感,以前也问过别人,好像也这么说的。因为使用never后,流程不会往下执行,需要通过processInstance.signal("xx")来确定流程流程哪个节点。

请看下面我的实现。

第一步一样,进入节点(node-enter)需要动态创建会签任务实例。

xml 代码
  1. <event type="node-enter">  
  2.   <action name="createInstance" class="com.ivo.bpm.action.DynamicCreateTaskAction">  
  3.   </action>  
  4. </event>  
java 代码
  1. public class DynamicCreateTaskAction extends BaseAction {      
  2.      
  3.     private static final long serialVersionUID = 1L;      
  4.      
  5.     public void execute(ExecutionContext executionContext) throws Exception {      
  6.         Token token = executionContext.getToken();      
  7.         TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();      
  8.         TaskNode taskNode = (TaskNode) executionContext.getNode();      
  9.         Task task = (Task)taskNode.getTasks().iterator().next();      
  10.   
  11.         tmi.createTaskInstance(task, token).setActorId( "T0512001" );   
  12.         tmi.createTaskInstance(task, token).setActorId( "T0512002" );   
  13.     }      
  14. }  

为了方便,随便指定了两个参与者。在实际情况中,这些参与者应该是在客户端指定的。然后通过流程变量的方式传入jbpm中。

第二步是关键,在结束任务(task-end)事件中,判断用户到底选择了哪个transition,然后再判断任务有无全部结束,如果已经全部结束,则通过processInstance.signal(transition)驱动流程流程指定的node。经过测试,在task-end事件中,无法再调用signal方法,两个方法冲突,本身task-end就在signal方法中。只能在task-end完成之后,通过另外的session来驱动流程的流向。

 

评论
发表评论

您还没有登录,请登录后发表评论

wuxufeng8080
搜索本博客
最近加入圈子
存档
最新评论