JBPM实践之:并发子流程的实现
【转载】:http://www.blogjava.net/ycyk168/archive/2008/11/12/240096.html
关于JBPM中并发子流程的实现方式,网上有很多的说法,但是好像每种办法都有这样那样的缺点,要么实现太复杂,要么就是会使Token无法继续流转。这里我介绍一种我的并发子流程的实现方式:使用TaskNode使任务并行的方式,模拟实现JBPM子流程的并发执行。
?我先简单的介绍一下实现思路:
???????? 1、数据库中应该有至少三个已经发布过的流程定义(ProcessDefinition),发布的顺序无所谓,一个主流程两个子流程
???????? 2、我们在主流程中要实现并发子流程的环节放置TaskNode,设置create-tasks="false"、signal="last-wait"
???????? 3、我们想要实现几个子流程的并发就在第二步放置的TaskNode中放置几个Task,每个Task的名字都是要并发的子流程的名称
???????? 4、在TaskNode的Node-Enter action中,我们手动为每一个Task创建一个任务实例,同时我们取得Task的名字也就是要并发的子流程的名字,创建流程实例
???????? 5、为每个新创建的流程实例设置流程变量:TaskInstanceID表示创建当前子流程的那个主流程任务实例ID,并使子流程开始流转
???????? 6、子流程结束,取得流程变量TaskInstanceID,该流程变量TaskInstanceID是创建他的那个主流程的任务实例,得到该TaskInstance,并TaskInstance.end();
???????? 这个时候因为我们设置了TaskNode的Signal为"last-wait",所以当所有的子流程均结束的时候,主流程才会继续,这样我们也就实现了子流程的并发效果。很简单的一个思路实现起来也并不复杂.
?
下面是该子流程的ProcessEndAction:public class SubProcessEndAction implements ActionHandler { public void execute(ExecutionContext executionContext) throws Exception { System.out.println(executionContext.getProcessDefinition().getName()+"结束"); //得到创建当前子流程的那个TaskInstanceID String taskInstanceID = executionContext.getContextInstance().getVariable("TaskInstanceID").toString(); //业务Service JbpmTestFacade jbpmTestFacade = ((JbpmTestFacade)SpringBeanUtil.getBean("jbpmTestFacade")); //取得创建当前子流程的那个主流程taskInstance TaskInstance taskInstance = jbpmTestFacade.geTaskInstance(Long.valueOf(taskInstanceID)); taskInstance.end(); }}
?