互斥撤回任務的另外一種實現方法

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回去实验了,可惜家里不能上网,只有周一再来和大家交流。
Global site tag (gtag.js) - Google Analytics