这里仅讨论通过action动态创建task来实现的方式。
决定会签的方式主要是通过task-node的signal属性来决定的。
- 会签中,一个人reject,则结束会签,退回起草人;全部通过,则流到下一个node。
- 会签中,等待所有的人完成会签任务,然后根据会签人的意见(即所选的transition),来决定流程流向哪个node。
第一种情况,signal="last-wait",只要一个人拒绝,则系统需要将其他没有完成的任务完成掉,在完成时需要以拒绝的那个transition来做end,具体可以参考 http://tomkoo.iteye.com/blog/24690 ,里面有很清楚的代码及解释。
第二种情况, signal="never",这种情况正是我现在需要解决的。以前一直没有空来测试。今天看了一下signal的说面,突然来了灵感,以前也问过别人,好像也这么说的。因为使用never后,流程不会往下执行,需要通过processInstance.signal("xx")来确定流程流程哪个节点。
请看下面我的实现。
第一步一样,进入节点(node-enter)需要动态创建会签任务实例。
- <event type="node-enter">
- <action name="createInstance" class="com.ivo.bpm.action.DynamicCreateTaskAction">
- </action>
- </event>
- public class DynamicCreateTaskAction extends BaseAction {
- private static final long serialVersionUID = 1L;
- public void execute(ExecutionContext executionContext) throws Exception {
- Token token = executionContext.getToken();
- TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
- TaskNode taskNode = (TaskNode) executionContext.getNode();
- Task task = (Task)taskNode.getTasks().iterator().next();
- tmi.createTaskInstance(task, token).setActorId( "T0512001" );
- tmi.createTaskInstance(task, token).setActorId( "T0512002" );
- }
- }
为了方便,随便指定了两个参与者。在实际情况中,这些参与者应该是在客户端指定的。然后通过流程变量的方式传入jbpm中。
第二步是关键,在结束任务(task-end)事件中,判断用户到底选择了哪个transition,然后再判断任务有无全部结束,如果已经全部结束,则通过processInstance.signal(transition)驱动流程流程指定的node。经过测试,在task-end事件中,无法再调用signal方法,两个方法冲突,本身task-end就在signal方法中。只能在task-end完成之后,通过另外的session来驱动流程的流向。