互斥撤回任務的另外一種實現方法
oisiv
2007-05-22
参考了圈子里面各位的文章,发现那些实现方式并不适合自己的项目要求,所以自己想其他的方法了。不过,还有问题无法解决。
流程图 <?xml version="1.0" encoding="UTF-8"?> <process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="stan_c_1"> <start-state name="开始"> <transition name="送交审核" to="并发任务"></transition> </start-state> <task-node name="审核"> <task name="开始审核" description="0"> <controller> <variable name="isEdit" access="read,write,required"></variable> </controller> <assignment class="tw.com.glm.workflow.assign.CommonAssignmentHandler"> </assignment> </task> <transition name="拒绝审核" to="退回修改"></transition> <transition name="完成审核" to="流程确认"></transition> </task-node> <task-node name="退回修改"> <task name="退回提交人修改"> <assignment actor-id="#{processStarter}"></assignment> </task> <transition name="送交审核" to="审核"></transition> </task-node> <state name="流程确认"> <transition name="完成流程" to="并发完成"> <action name="流程确认" class="tw.com.glm.workflow.action.FlowConfirmActionHandler"> </action> </transition> </state> <fork name="并发任务"> <transition name="审核" to="审核"></transition> <transition name="撤销" to="撤销流程"></transition> </fork> <join name="并发完成"> <event type="node-enter"> <action name="并发设置" class="tw.com.glm.workflow.action.SetDiscriminatorForJoinNodeActionHandler"></action> </event> <transition name="并发完成" to="完成"></transition> </join> <task-node name="撤销流程"> <task name="撤销流程"> <assignment actor-id="#{processStarter}"></assignment> </task> <transition name="撤销流程" to="并发完成"></transition> </task-node> <end-state name="完成"></end-state> </process-definition> 在join节点,SetDiscriminatorForJoinNodeActionHandler类的内容如下 public class SetDiscriminatorForJoinNodeActionHandler implements ActionHandler { /** * Comment for <code>serialVersionUID</code> */ private static final long serialVersionUID = 1L; /* (non Javadoc) * @see org.jbpm.graph.def.ActionHandler#execute(org.jbpm.graph.exe.ExecutionContext) */ public void execute(ExecutionContext arg0) throws Exception { Join join = (Join)arg0.getNode(); join.setDiscriminator(true); } } 经过fork节点后,两个分支的人物都被创建,分配给对应的用户。当用户在UI选择transition后,进入某个分支,完成任务,然后整个流程被结束。但另外的分支的任务依然未结束,感觉还是要自己手工结束,但是不是也用end()呢?还是cancel(),不过听说cancel也还是要调用end.那么在end后时候还是要重走join节点呢?嗯,需要测试一下。 我本以为,jbpm会在结束join节点的时候,会自动帮我们关闭其他未完成的分支。但并不是这样。 |
|
piaoling
2007-05-23
不清楚你的意思
|
|
gsccnu
2007-06-15
join是如何end 其他子Token的?我始终找不到调用过程,初步推断是通过调用leave(parentContext)达到的,但是顺着这点找了很久也没有找到,如有知者,请告之
|
|
youngliuus
2007-06-15
join会end其它的子token吗?看代码好像不会哦。他如果决定往下走的话,只是把所有的子token的ableToReactivateParent设置为false;这样这些子token到达join时就没有任何作用了。
如果你想达到这样的效果的话,我觉得需要写一个node-leave event handler;在这个handler里把所有得的子token结束。 |
|
gsccnu
2007-06-15
看来现在的Discriminator只是达到异步的效果,想要互斥还要自己动手
|
|
gsccnu
2007-06-15
使用cancel会引发end。
不知道使用 public void suspend() { isSuspended = true; isOpen = false; } 会不会达到理想的效果。 只有周6回去实验了,可惜家里不能上网,只有周一再来和大家交流。 |