1. 程式人生 > 其它 >jbpm5.1介紹(10)

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

執行到錯誤流程流程自動結束