jbpm5.1介绍(10)

简介: Junit测试异常事件触发 下面的示例中测试在程序中触发异常事件的流程,流程如下 测试程序 public void testTimerBoundaryEventInterrupting() throws Exception { KnowledgeBase kbase = crea...

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

执行到错误流程流程自动结束

目录
相关文章
|
Java 编译器 API
深入理解Java中的Lambda表达式
在探索Java语言的现代特性时,Lambda表达式无疑是一个引人注目的话题。本文将深入探讨Java中Lambda表达式的概念、语法及其应用,帮助读者更好地理解和使用这一强大的工具。通过具体示例和场景分析,我们将揭示Lambda表达式如何简化代码、提高开发效率,并讨论其在多线程编程中的应用。
|
存储 Java
Java之可变参数和Collections的详细解析
1. 可变参数 在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以对其简化. 格式: 修饰符 返回值类型 方法名(参数类型... 形参名){ } 底层:
160 0
|
Java 数据库连接 数据库
Mybatis【第一个 Mybatis 程序】
Mybatis【第一个 Mybatis 程序】
|
Kubernetes 安全 Cloud Native
带你读《云原生机密计算最佳实践白皮书》——海光CSV:海光安全虚拟化技术
带你读《云原生机密计算最佳实践白皮书》——海光CSV:海光安全虚拟化技术
3774 0
|
存储 Java
Java集合类(上)
Java集合类(上)
|
存储 Java C++
Python语法特点
Python语法特点
Python语法特点
|
Linux API 芯片
Apifox使用教程,太好用了!
因此今天介绍一个 API 管理工具Apifox使用教程,一方面具备 Swagger 和 postman 的功能,一方面又针对上述问题做了优化,能够提升在工作过程中的效率。
Apifox使用教程,太好用了!
|
C++
编译JDK11:ERROR: Build failed for target ‘default (exploded-image)‘ in configuration ‘windows-x86_64
编译JDK11:ERROR: Build failed for target ‘default (exploded-image)‘ in configuration ‘windows-x86_64
387 0
|
编译器 程序员 C语言
程序员需要了解的硬核知识之汇编语言(一)(上)
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。
程序员需要了解的硬核知识之汇编语言(一)(上)
ES6—09:对象成员查找规则
ES6—09:对象成员查找规则
196 0
ES6—09:对象成员查找规则