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

jbpm5.1介紹(9)

Junit測試呼叫子流程

下面的示例中測試在程式中呼叫其它程式的子流程的示例,需要載入兩個配置檔案

需要指定屬性

下面是呼叫的示例程式

public void testCallActivity() throws Exception {
		System.out.println("Loading process BPMN2-CallActivity.bpmn2");
		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
				.newKnowledgeBuilder();
		kbuilder.add(ResourceFactory
				.newClassPathResource("junit/BPMN2-CallActivity.bpmn2"),
				ResourceType.BPMN2);
		kbuilder.add(
				ResourceFactory
						.newClassPathResource("junit/BPMN2-CallActivitySubProcess.bpmn2"),
				ResourceType.BPMN2);
		KnowledgeBase kbase = kbuilder.newKnowledgeBase();
		StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("x", "oldValue");
		ProcessInstance processInstance = ksession.startProcess(
				"ParentProcess", params);
		assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
		assertEquals("new value",
				((WorkflowProcessInstance) processInstance).getVariable("y"));
	}

 程式輸出以下結果

Loading process BPMN2-CallActivity.bpmn2 我是子流程 subX=oldValue

證明子流程呼叫成功

Junit測試子流程執行過程中觸發的事件

下面的示例中測試在子流程執行的過程中觸發各種事件

流程如下圖

在執行到hello1的時候變數x是沒有值的,在執行hello2的時候賦值,在執行到hello3的時候變數能夠輸出值

測試程式如下:

public void testSubProcess() throws Exception {
		KnowledgeBase kbase = createKnowledgeBase("BPMN2-SubProcess.bpmn2");
		StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
		ksession.addEventListener(new DefaultProcessEventListener() {
			public void afterProcessStarted(ProcessStartedEvent event) {
				System.out.println("流程啟動以後"+event);
			}

			public void beforeVariableChanged(ProcessVariableChangedEvent event) {
				System.out.println("變數改變之前"+event);
			}

			public void afterVariableChanged(ProcessVariableChangedEvent event) {
				System.out.println("變數改變以後"+event);
			}
		});
		ProcessInstance processInstance = ksession.startProcess("SubProcess");
		assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
	}

 輸出的結果如下:

Loading process BPMN2-SubProcess.bpmn2 x = null 變數改變之前==>[ProcessVariableChanged(id=2:x; instanceId=1:x; oldValue=null; newValue=Hello; processName=Minimal SubProcess; processId=SubProcess)] 變數改變以後==>[ProcessVariableChanged(id=2:x; instanceId=1:x; oldValue=null; newValue=Hello; processName=Minimal SubProcess; processId=SubProcess)] x = Hello Goodbye World 流程啟動以後==>[ProcessStarted(name=Minimal SubProcess; id=SubProcess)]

Junit測試多流程迴圈

下面的示例中主要測試的是多流程迴圈的示例

介面流程如下

執行的測試程式如下:

public void testMultiInstanceLoopCharacteristicsProcess() throws Exception {
		KnowledgeBase kbase = createKnowledgeBase("BPMN2-MultiInstanceLoopCharacteristicsProcess.bpmn2");
		StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
		Map<String, Object> params = new HashMap<String, Object>();
		List<String> myList = new ArrayList<String>();
		myList.add("First Item");
		myList.add("Second Item");
		params.put("list", myList);
		ProcessInstance processInstance = ksession.startProcess(
				"MultiInstanceLoopCharacteristicsProcess", params);
		assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
	}

 執行結果如下

Loading process BPMN2-MultiInstanceLoopCharacteristicsProcess.bpmn2 item = First Item item = Second Item Goodbye World

Junit測試異常事件處理流程

下面的示例中主要測試的是在執行到子流程中的異常的時候的處理流程

程式流程如下:

首先執行子流程中的內容,預設遇到錯誤,將觸發錯誤事件,然後執行對應的事件,輸出內容

測試程式如下:

public void testEscalationBoundaryEvent() throws Exception {
		KnowledgeBase kbase = createKnowledgeBase("BPMN2-EscalationBoundaryEvent.bpmn2");
		StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
		ProcessInstance processInstance = ksession
				.startProcess("EscalationBoundaryEvent");
		assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
	}

 執行完結果如下所示:

Loading process BPMN2-EscalationBoundaryEvent.bpmn2 執行錯誤流程,觸發事件 Escalation handled

Junit測試異常事件處理流程2

下面的示例中主要測試異常處理,同上例基本相同都是執行到錯誤結點的時候自動觸發事件,但是加了一個選擇分支

程式流程示例如圖

測試程式如下所示

public void testEscalationBoundaryEventInterrupting() throws Exception {
		KnowledgeBase kbase = createKnowledgeBase("BPMN2-EscalationBoundaryEventInterrupting.bpmn2");
		StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
		ksession.getWorkItemManager().registerWorkItemHandler("MyTask",
				new DoNothingWorkItemHandler());
		ProcessInstance processInstance = ksession
				.startProcess("EscalationBoundaryEvent");
		assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
		// TODO: check for cancellation of task
	}

 執行結果如下:

Loading process BPMN2-EscalationBoundaryEventInterrupting.bpmn2 Escalation handled

Junit測試定時器邊界事件

下面的示例中主要測試定時器邊界事件

程式流程如下所示:

在屬性中設定超時時間是500ms,那麼在下面的程式中設定讓程式暫停一下執行,觸發超時事件

public void testTimerBoundaryEventDuration() throws Exception {
		KnowledgeBase kbase = createKnowledgeBase("BPMN2-TimerBoundaryEventDuration.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);
		assertProcessInstanceCompleted(processInstance.getId(), ksession);
	}

 設定為1000,那麼就將執行錯誤處理事件

執行的結果如下

Loading process BPMN2-TimerBoundaryEventDuration.bpmn2 Timer handled

Junit測試定時器超時處理

下面的兩個示例和上面基本上沒有區別,只是強調了一下超時處理的週期和邊界事件

直接看示例程式吧

public void testTimerBoundaryEventCycle1() throws Exception {
		KnowledgeBase kbase = createKnowledgeBase("BPMN2-TimerBoundaryEventCycle1.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);
		assertProcessInstanceCompleted(processInstance.getId(), ksession);
	}

	public void testTimerBoundaryEventCycle2() throws Exception {
		KnowledgeBase kbase = createKnowledgeBase("BPMN2-TimerBoundaryEventCycle2.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);
		assertProcessInstanceActive(processInstance.getId(), ksession);
		Thread.sleep(1000);
		assertProcessInstanceActive(processInstance.getId(), ksession);
		ksession.abortProcessInstance(processInstance.getId());
		Thread.sleep(1000);
	}

 分別的執行結果如下:

1)同上示例基本相同

Loading process BPMN2-TimerBoundaryEventCycle1.bpmn2 Timer handled 2)執行兩次超時事件

Loading process BPMN2-TimerBoundaryEventCycle2.bpmn2 Timer handled Timer handled