今天看了下JBPM5.4官方提供的例子发布包,研究了下,发现流程在流转的时候不一定在所有的节点间都用线连起来。在程序中可以控制流转到哪个节点上,(注意是流程不要流转到结束节点上就行了)。下面是一个例子:
首先我们定义了一个流程
task node1
task node2
task node3 → 结束
注意了在流程定义文件中,看源码,我们一定要在流程节点上加一个 tns.adHoc="true"
来表示流程文档所使用的规范
然后就可以在程序里面控制流转了,注意这里注册了一个什么都不做的工作项:
KnowledgeBase kbase = createKnowledgeBase("com/process/33.bpmn");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
System.out.println(ksession);
ProcessInstance processInstance = ksession.startProcess("com.sample.bpmn");
System.out.println(processInstance.getId());
// assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
// ksession = restoreSession(ksession, true);
ksession.getWorkItemManager().registerWorkItemHandler("", new DoNothingWorkItemHandler());
System.out.println("Triggering node");
ksession.signalEvent("t2", null, processInstance.getId());
ksession.signalEvent("t1", null, processInstance.getId());
ksession.signalEvent("t1", null, processInstance.getId());
ksession.signalEvent("t2", null, processInstance.getId());
ksession.signalEvent("t1", null, processInstance.getId());
ksession.signalEvent("t2", null, processInstance.getId());
最后打印输出:
org.drools.impl.StatefulKnowledgeSessionImpl@13055ba
1
Triggering node
22222222
1111111
1111111
22222222
1111111
22222222