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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java Lambda表达式
- 介绍一款 API 敏捷开发工具
- XSS(跨站脚本攻击)简单讲解
- Java中多线程的使用(超级超级详细)线程池 7
- Python 将土味情话语录设置为桌面壁纸
- Java中多线程的使用(超级超级详细)线程安全原理解析 4
- Java中多线程的使用(超级超级详细) Thead类的使用 3
- Java Properties集合基础解析
- File 类基础解析3 文件过滤器优化
- 原创 | 我在git merge的时候遇到了冲突,怎么解决?
- protobuffer的前世今生(一)——简介
- protobuffer的前世今生(二)——编码
- Java中多线程的使用(超级超级详细)+多线程的实现原理 2
- protobuffer的前世今生(三)——序列化和反序列化性能比较
- 女生勿扰,只适合男孩子的 Python 爬虫,里面东西不给钱统统白送