jbpm5.1介紹(10)
Junit測試異常事件觸發
下面的示例中測試在程式中觸發異常事件的流程,流程如下
測試程式
public void testTimerBoundaryEventInterrupting() throws Exception { KnowledgeBase kbase = createKnowledgeBase("BPMN2-TimerBoundaryEventInterrupting.bpmn2"); StatefulKnowledgeSession ksession = createKnowledgeSession(kbase); ksession.getWorkItemManager().registerWorkItemHandler("MyTask", new DoNothingWorkItemHandler()); ProcessInstance processInstance = ksession .startProcess("TimerBoundaryEvent"); assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE); Thread.sleep(1000); ksession = restoreSession(ksession, true); System.out.println("Firing timer"); ksession.fireAllRules(); assertProcessInstanceCompleted(processInstance.getId(), ksession); }
結果如下
Loading process BPMN2-TimerBoundaryEventInterrupting.bpmn2 Timer handled Firing timer
Junit測試根據規則執行子流程
下面的示例中測試在程式中加入固定規則,然後如果發現符合規則那麼向下執行子流程
流程介面如下
規則檔案如下
package org.drools.bpmn2 import org.drools.runtime.process.ProcessContext rule "Auto-activate Hello1" ruleflow-group "Hello" when then System.out.println(drools); System.out.println(drools.getContext(ProcessContext.class)); System.out.println(drools.getContext(ProcessContext.class).getProcessInstance()); drools.getContext(ProcessContext.class).getProcessInstance().signalEvent("Hello1", null); end
測試程式
public void testAdHocSubProcess() throws Exception { System.out.println("Loading process BPMN2-AdHocSubProcess.bpmn2"); KnowledgeBuilder kbuilder = KnowledgeBuilderFactory .newKnowledgeBuilder(); kbuilder.add(ResourceFactory .newClassPathResource("junit/BPMN2-AdHocSubProcess.bpmn2"), ResourceType.BPMN2); kbuilder.add(ResourceFactory .newClassPathResource("junit/BPMN2-AdHocSubProcess.drl"), ResourceType.DRL); KnowledgeBase kbase = kbuilder.newKnowledgeBase(); StatefulKnowledgeSession ksession = createKnowledgeSession(kbase); TestWorkItemHandler workItemHandler = new TestWorkItemHandler(); ksession.getWorkItemManager().registerWorkItemHandler("Human Task", workItemHandler); ProcessInstance processInstance = ksession .startProcess("AdHocSubProcess"); assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE); WorkItem workItem = workItemHandler.getWorkItem(); assertNull(workItem); ksession = restoreSession(ksession, true); ksession.getWorkItemManager().registerWorkItemHandler("Human Task", workItemHandler); ksession.fireAllRules(); System.out.println("Signaling Hello2"); ksession.signalEvent("Hello2", null, processInstance.getId()); workItem = workItemHandler.getWorkItem(); assertNotNull(workItem); ksession = restoreSession(ksession, true); ksession.getWorkItemManager().registerWorkItemHandler("Human Task", workItemHandler); ksession.getWorkItemManager().completeWorkItem(workItem.getId(), null); }
執行結果如下
Loading process BPMN2-AdHocSubProcess.bpmn2 org.drools.base.DefaultKnowledgeHelper@1bdb58 org.drools.spi.ProcessContext@1568654 WorkflowProcessInstance1 [processId=AdHocSubProcess,state=1] Hello World 1 Signaling Hello2 Hello World 2 執行test workitemWorkItem 1 [name=Human Task, state=0, processInstanceId=1, parameters{}]
Junit測試根據規則執行子流程並自動完成
下面的示例中測試在程式中如下圖
執行流程如下,執行完成之後自動完成並且向下走
測試程式
public void testAdHocSubProcessAutoComplete() throws Exception {
System.out
.println("Loading process BPMN2-AdHocSubProcessAutoComplete.bpmn2");
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
.newKnowledgeBuilder();
kbuilder.add(
ResourceFactory
.newClassPathResource("junit/BPMN2-AdHocSubProcessAutoComplete.bpmn2"),
ResourceType.BPMN2);
kbuilder.add(ResourceFactory
.newClassPathResource("junit/BPMN2-AdHocSubProcess.drl"),
ResourceType.DRL);
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
ProcessInstance processInstance = ksession
.startProcess("AdHocSubProcess");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
WorkItem workItem = workItemHandler.getWorkItem();
assertNull(workItem);
ksession = restoreSession(ksession, true);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
ksession.fireAllRules();
workItem = workItemHandler.getWorkItem();
assertNotNull(workItem);
ksession = restoreSession(ksession, true);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
ksession.getWorkItemManager().completeWorkItem(workItem.getId(), null);
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
執行結果
Loading process BPMN2-AdHocSubProcessAutoComplete.bpmn2 org.drools.base.DefaultKnowledgeHelper@6833f2 org.drools.spi.ProcessContext@1bdb58 WorkflowProcessInstance1 [processId=AdHocSubProcess,state=1] 執行test workitemWorkItem 1 [name=Human Task, state=0, processInstanceId=1, parameters{}] Goodbye World
Junit測試觸發任務
下面的示例中測試在程式中執行並且觸發任務
流程如下
測試程式
public void testAdHocProcess() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-AdHocProcess.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ProcessInstance processInstance = ksession.startProcess("AdHocProcess");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
ksession = restoreSession(ksession, true);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new DoNothingWorkItemHandler());
System.out.println("Triggering node");
ksession.signalEvent("Task1", null, processInstance.getId());
assertProcessInstanceActive(processInstance.getId(), ksession);
ksession.signalEvent("User1", null, processInstance.getId());
assertProcessInstanceActive(processInstance.getId(), ksession);
ksession.insert(new Person());
ksession.signalEvent("Task3", null, processInstance.getId());
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
測試結果
Loading process BPMN2-AdHocProcess.bpmn2 Triggering node Task1 Task3
Junit測試獲取異常事件
下面的示例中測試在程式中得到異常事件
流程如圖
程式中觸發事件
public void testIntermediateCatchEventSignal() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-IntermediateCatchEventSignal.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new DoNothingWorkItemHandler());
ProcessInstance processInstance = ksession
.startProcess("IntermediateCatchEvent");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
ksession = restoreSession(ksession, true);
// now signal process instance
ksession.signalEvent("MyMessage", "SomeValue", processInstance.getId());
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
執行結果
Loading process BPMN2-AdHocProcess.bpmn2 Triggering node Task1 Task3
Junit測試獲取事件訊息
下面的示例中測試在程式中得到事件訊息
測試程式
public void testIntermediateCatchEventMessage() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-IntermediateCatchEventMessage.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new DoNothingWorkItemHandler());
ProcessInstance processInstance = ksession
.startProcess("IntermediateCatchEvent");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
ksession = restoreSession(ksession, true);
// now signal process instance
ksession.signalEvent("Message-HelloMessage", "SomeValue",
processInstance.getId());
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
執行結果
Loading process BPMN2-IntermediateCatchEventMessage.bpmn2 SomeValue
Junit測試超時事件
下面的示例中測試在流程中超時觸發事件
流程如下
測試程式如下
public void testIntermediateCatchEventTimerDuration() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-IntermediateCatchEventTimerDuration.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new DoNothingWorkItemHandler());
ProcessInstance processInstance = ksession
.startProcess("IntermediateCatchEvent");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
// now wait for 1 second for timer to trigger
Thread.sleep(1000);
ksession = restoreSession(ksession, true);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new DoNothingWorkItemHandler());
ksession.fireAllRules();
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
超時觸發事件,結果如下
Loading process BPMN2-IntermediateCatchEventTimerDuration.bpmn2 Timer triggered
Junit測試超時事件1
下面的示例中測試在流程中超時觸發事件,基本操作同上
示例如果同上,不再貼出
Junit測試超時事件2
下面的示例中測試在流程中執行兩次超時事件並且都觸發對應的事件執行
測試程式
public void testIntermediateCatchEventTimerCycle2() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-IntermediateCatchEventTimerCycle2.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new DoNothingWorkItemHandler());
ProcessInstance processInstance = ksession
.startProcess("IntermediateCatchEvent");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
// now wait for 1 second for timer to trigger
Thread.sleep(1000);
assertProcessInstanceActive(processInstance.getId(), ksession);
Thread.sleep(1000);
assertProcessInstanceActive(processInstance.getId(), ksession);
ksession.abortProcessInstance(processInstance.getId());
Thread.sleep(1000);
}
執行結果
Loading process BPMN2-IntermediateCatchEventTimerCycle2.bpmn2 Timer triggered Timer triggered
Junit測試條件觸發事件執行
下面的示例中測試在流程中當條件等於jack時觸發事件執行
流程如下
測試程式
public void testIntermediateCatchEventCondition() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-IntermediateCatchEventCondition.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ProcessInstance processInstance = ksession
.startProcess("IntermediateCatchEvent");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
ksession = restoreSession(ksession, true);
// now activate condition
Person person = new Person();
person.setName("Jack");
ksession.insert(person);
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
執行結果
Loading process BPMN2-IntermediateCatchEventCondition.bpmn2 Condition triggered
Junit測試錯誤事件
下面的示例中測試錯誤事件的執行
測試程式
public void testErrorEndEventProcess() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-ErrorEndEvent.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ProcessInstance processInstance = ksession
.startProcess("ErrorEndEvent");
assertProcessInstanceAborted(processInstance.getId(), ksession);
}
執行結果
Loading process BPMN2-ErrorEndEvent.bpmn2
執行到錯誤流程流程自動結束