jbpm5.1介绍(7)
Junit测试评估流程
评估流程的界面如下:
这个示例里边用到了Script Task,Service Task和User Task
Log执行记录日志的功能,打印出一段信息
RegisterRequest调用外部预定义的程序或者其它引擎的程序
Two调用人工任务
看一下调用的测试程序
public void testEvaluationProcess() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-EvaluationProcess.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new SystemOutWorkItemHandler());
ksession.getWorkItemManager().registerWorkItemHandler("RegisterRequest", new SystemOutWorkItemHandler());
Map<String, Object> params = new HashMap<String, Object>();
params.put("employee", "UserId-12345");
ProcessInstance processInstance = ksession.startProcess("Evaluation", params);
assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
}
在程序中注册工作处理程序
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new SystemOutWorkItemHandler()); ksession.getWorkItemManager().registerWorkItemHandler("RegisterRequest", new SystemOutWorkItemHandler());
看一下SystemOutWorkItemHandler中的内容
public class SystemOutWorkItemHandler implements WorkItemHandler {
public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
System.out.println("Executing work item " + workItem);
manager.completeWorkItem(workItem.getId(), null);
}
public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
System.out.println("Aborting work item " + workItem);
manager.abortWorkItem(workItem.getId());
}
}
看一下WorkItemHandler,这个接口
Method Summary | |
---|---|
void |
abortWorkItem(WorkItem workItem, WorkItemManager manager) The given work item should be aborted. |
void |
executeWorkItem(WorkItem workItem, WorkItemManager manager) The given work item should be executed. |
有两个方法,一个是要执行的工作任务,一个是忽略的工作任务
运行junit测试,会发现输出了
Loading process BPMN2-EvaluationProcess.bpmn2 Processing evaluation for employee UserId-12345 Executing work item WorkItem 1 [name=RegisterRequest, state=0, processInstanceId=1, parameters{employeeId=UserId-12345}] Executing work item WorkItem 2 [name=Human Task, state=0, processInstanceId=1, parameters{}] 先是执行RegisterRequest这个里边的executeWorkItem方法
然后执行了Human Task里的executeWorkItem方法
最后使用
assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
判断状态完成,执行成功
Junit测试评估流程2
评估流程的界面如下,同样的流程,打开BPMN2-EvaluationProcess2.bpmn2文件
同前边的示例一下,看一下测试2的示例程序
public void testEvaluationProcess2() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-EvaluationProcess2.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new SystemOutWorkItemHandler());
Map<String, Object> params = new HashMap<String, Object>();
params.put("employee", "UserId-12345");
ProcessInstance processInstance = ksession.startProcess("com.sample.evaluation", params);
assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
}
执行完成后的结果如下:
Loading process BPMN2-EvaluationProcess2.bpmn2 Executing work item WorkItem 1 [name=Human Task, state=0, processInstanceId=1, parameters{ActorId=UserId-12345, Comment=You need to perform a self evaluation, Skippable=false, Content=, TaskName=Performance Evaluation, Priority=1}] Executing work item WorkItem 2 [name=Human Task, state=0, processInstanceId=1, parameters{ActorId=john, Comment=You need to perform an evaluation for employee UserId-12345, Skippable=false, Content=, TaskName=Performance Evaluation, Priority=1}] Executing work item WorkItem 3 [name=Human Task, state=0, processInstanceId=1, parameters{ActorId=mary, Comment=You need to perform an evaluation for employee UserId-12345, Skippable=false, Content=, TaskName=Performance Evaluation, Priority=1}] 每个人的工作任务自动向下执行。
Junit测试评估流程3
评估流程的界面如下,同第一个是一样的
看一下示例程序
public void testEvaluationProcess3() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-EvaluationProcess3.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new SystemOutWorkItemHandler());
ksession.getWorkItemManager().registerWorkItemHandler("RegisterRequest", new SystemOutWorkItemHandler());
Map<String, Object> params = new HashMap<String, Object>();
params.put("employee", "john2");
ProcessInstance processInstance = ksession.startProcess("Evaluation", params);
assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
}
执行之后看结果
Loading process BPMN2-EvaluationProcess3.bpmn2 Processing evaluation for employee john2 Executing work item WorkItem 1 [name=Human Task, state=0, processInstanceId=1, parameters{}]
可以看到只执行了Human Task,默认情况下注册进来的多个Handler如果不指定的话会默认执行Human Task,如果指定了就先指定执行的,如第一个示例再执行Human Task
Junit测试用户任务
接下来的示例是测试用户任务的示例,打开BPMN2-UserTask.bpmn2文件,流程定义文件如下
指定了ActorId为john
看测试用例程序
public void testUserTask() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-UserTask.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", workItemHandler);
ProcessInstance processInstance = ksession.startProcess("UserTask");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
ksession = restoreSession(ksession, true);
WorkItem workItem = workItemHandler.getWorkItem();
assertNotNull(workItem);
assertEquals("john", workItem.getParameter("ActorId"));
ksession.getWorkItemManager().completeWorkItem(workItem.getId(), null);
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
先定义了一个TestWorkItemHandler,然后将这个handler定义为人工任务
然后判断节点状态是否是激活状态
然后判断流程中执行的是john在执行这个任务并且完成,最后判断流程完成
TestWorkItemHandler中的内容如下:
public static class TestWorkItemHandler implements WorkItemHandler {
private List<WorkItem> workItems = new ArrayList<WorkItem>();
public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
workItems.add(workItem);
}
public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
}
public WorkItem getWorkItem() {
System.out.println("执行test workitem");
if (workItems.size() == 0) {
return null;
}
if (workItems.size() == 1) {
WorkItem result = workItems.get(0);
this.workItems.clear();
return result;
} else {
throw new IllegalArgumentException("More than one work item active");
}
}
public List<WorkItem> getWorkItems() {
List<WorkItem> result = new ArrayList<WorkItem>(workItems);
workItems.clear();
return result;
}
}
执行结果如下显示
Loading process BPMN2-UserTask.bpmn2 执行test workitem
Junit测试泳道
接下来的示例是一个测试泳道的例子,泳道的概念可以理解成一个角色或者一个组,就是相当于一组人
看流程图
定义了泳道“MyLane”
在hello上指定了ActorId是john,在Goodbye上没有指定人
看流程示例
public void testLane() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-Lane.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
ProcessInstance processInstance = ksession.startProcess("UserTask");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
ksession = restoreSession(ksession, true);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
WorkItem workItem = workItemHandler.getWorkItem();
assertNotNull(workItem);
assertEquals("john", workItem.getParameter("ActorId"));
Map<String, Object> results = new HashMap<String, Object>();
results.put("ActorId", "mary");
ksession.getWorkItemManager().completeWorkItem(workItem.getId(),
results);
ksession = restoreSession(ksession, true);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
workItem = workItemHandler.getWorkItem();
assertNotNull(workItem);
assertEquals("mary", workItem.getParameter("ActorId"));
ksession.getWorkItemManager().completeWorkItem(workItem.getId(), null);
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
定义任务并且执行,并且可以看到第一个用户任务的执行人是john,然后向里传入了第二个用户,mary
这个用户将被赋到泳道MyLane上
然后在看执行用户变成了mary,最后流程结束
看输出结果
Loading process BPMN2-Lane.bpmn2 执行test workitemWorkItem 1 [name=Human Task, state=0, processInstanceId=1, parameters{ActorId=john}] 执行test workitemWorkItem 2 [name=Human Task, state=0, processInstanceId=1, parameters{ActorId=mary}]
Junit测试异或流程
接下来的示例是测试gateway的异或流程,看一下示例
流程图如下
就是说只需要执行其中的一个流程,就可以让流程继续向下执行,这个示例是根据传入的变量X来看向哪执行
看测试代码
public void testExclusiveSplit() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-ExclusiveSplit.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Email",
new SystemOutWorkItemHandler());
Map<String, Object> params = new HashMap<String, Object>();
params.put("x", "First");
params.put("y", "Second");
ProcessInstance processInstance = ksession.startProcess(
"com.sample.test", params);
assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
}
执行测试流程结果如下
Loading process BPMN2-ExclusiveSplit.bpmn2 x=First Executing work item WorkItem 1 [name=Email, state=0, processInstanceId=1, parameters{Body=This is an urgent email First, Subject=Urgent email !, To=you@mail.com, From=me@mail.com}] 即当流程执行到其中有一个后则流程自动向下执行
Junit测试异或流程高级1
接下来的示例是测试,看如下流程定义
这个是根据动态传入的看结点的值是不是a如果是a则走上边的流程,如果不是则走下边的流程
public void testExclusiveSplitXPathAdvanced() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-ExclusiveSplitXPath-advanced.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Email",
new SystemOutWorkItemHandler());
Map<String, Object> params = new HashMap<String, Object>();
Document doc = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().newDocument();
Element hi = doc.createElement("hi");
Element ho = doc.createElement("ho");
hi.appendChild(ho);
Attr attr = doc.createAttribute("value");
ho.setAttributeNode(attr);
attr.setValue("a");
params.put("x", hi);
params.put("y", "Second");
ProcessInstance processInstance = ksession.startProcess(
"com.sample.test", params);
assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
}
根据传入的结点执行流程
执行结果如下
Loading process BPMN2-ExclusiveSplitXPath-advanced.bpmn2 x=[hi: null] Executing work item WorkItem 1 [name=Email, state=0, processInstanceId=1, parameters{Body=you@mail.com, Subject=Urgent email !, To=you@mail.com, From=me@mail.com}]
Junit测试异或流程高级2
接下来的示例是测试,如下流程图
流程结点定义
还是根据值来判断流向,这次只指定x
看测试程序
public void testExclusiveSplitXPathAdvanced2() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-ExclusiveSplitXPath-advanced-vars-not-signaled.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Email",
new SystemOutWorkItemHandler());
Map<String, Object> params = new HashMap<String, Object>();
Document doc = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().newDocument();
Element hi = doc.createElement("hi");
Element ho = doc.createElement("ho");
hi.appendChild(ho);
Attr attr = doc.createAttribute("value");
ho.setAttributeNode(attr);
attr.setValue("a");
params.put("x", hi);
params.put("y", "Second");
ProcessInstance processInstance = ksession.startProcess(
"com.sample.test", params);
assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
}
执行的流程结果
Loading process BPMN2-ExclusiveSplitXPath-advanced-vars-not-signaled.bpmn2 y=Second Executing work item WorkItem 1 [name=Email, state=0, processInstanceId=1, parameters{Body=you@mail.com, Subject=Urgent email !, To=you@mail.com, From=me@mail.com}]
Junit测试异或流程带参数
与上边几个程序基本一致,直接上代码吧
public void testExclusiveSplitXPathAdvancedWithVars() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-ExclusiveSplitXPath-advanced-with-vars.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Email",
new SystemOutWorkItemHandler());
Map<String, Object> params = new HashMap<String, Object>();
Document doc = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().newDocument();
Element hi = doc.createElement("hi");
Element ho = doc.createElement("ho");
hi.appendChild(ho);
Attr attr = doc.createAttribute("value");
ho.setAttributeNode(attr);
attr.setValue("a");
params.put("x", hi);
params.put("y", "Second");
ProcessInstance processInstance = ksession.startProcess(
"com.sample.test", params);
assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
}
执行结果
Loading process BPMN2-ExclusiveSplitXPath-advanced-with-vars.bpmn2 x=[hi: null] Executing work item WorkItem 1 [name=Email, state=0, processInstanceId=1, parameters{Body=you@mail.com, Subject=Urgent email !, To=you@mail.com, From=me@mail.com}]
Junit测试异或流程优先和默认
下面的两个流程和上边基本一致只是细节上有些不同,一个是根据优先级流向一个是根据默认值流向
优先
public void testExclusiveSplitPriority() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-ExclusiveSplitPriority.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Email",
new SystemOutWorkItemHandler());
Map<String, Object> params = new HashMap<String, Object>();
params.put("x", "First");
params.put("y", "Second");
ProcessInstance processInstance = ksession.startProcess(
"com.sample.test", params);
assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
}
默认
public void testExclusiveSplitDefault() throws Exception {
KnowledgeBase kbase = createKnowledgeBase("BPMN2-ExclusiveSplitDefault.bpmn2");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Email",
new SystemOutWorkItemHandler());
Map<String, Object> params = new HashMap<String, Object>();
params.put("x", "NotFirst");
params.put("y", "Second");
ProcessInstance processInstance = ksession.startProcess(
"com.sample.test", params);
assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED);
}
分别的执行结果如下:
优先
Loading process BPMN2-ExclusiveSplitPriority.bpmn2 y=Second Executing work item WorkItem 1 [name=Email, state=0, processInstanceId=1, parameters{Body=This is an urgent email First, Subject=Urgent email !, To=you@mail.com, From=me@mail.com}]
默认
Loading process BPMN2-ExclusiveSplitDefault.bpmn2 y=Second Executing work item WorkItem 1 [name=Email, state=0, processInstanceId=1, parameters{Body=This is an urgent email NotFirst, Subject=Urgent email !, To=you@mail.com, From=me@mail.com}]
- 生信人写程序2. Editplus添加Perl, Shell, R, markdown模板和语法高亮
- Rfam 12.0+本地使用 (最新版教程)
- 宝马汽车安全漏洞详解:古有伯乐识良驹,今有黑客擒宝马
- string.length()与-1比较为什么会出现匪夷所思的结果
- css模块化及CSS Modules使用详解
- 使用OpenCV,Python和模板匹配来播放“Waldo在哪里?”
- C++ 字符串分割
- 算法笔记之排序
- java中String类学习
- React Native之ListView实现九宫格效果
- 迷宫问题(bfs的应用)
- 流量都去哪儿了 —— 三板斧搞定Android网络流量测试
- 富集分析DotPlot,可以服
- 最长单调递增子序列
- 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 数组属性和方法
- 推荐一款万能抓包神器:Fiddler Everywhere
- 猿实战04——el-upload结合nginx之通用图片处理
- 30 多个有内味道且笑死的人代码注释
- Logstash-input-jdbc 同步 mysql 准实时数据至 ElasticSearch 搜索引擎
- 总结一些,我在书写 CSS 的时候,经常犯的错误!
- 通俗理解 set,dict 背后的哈希表
- K8S 生态周报| Google 选择 Cilium 作为 GKE 下一代数据面
- [Introduction]万字手撕Go http源码server.go
- Python 3.9 值得关注的更新点
- 趣味算法:JS实现红绳算法(匹配合适的另一半)
- 2019夏令营笔试编程题
- redis学习(四)
- 使用 Yaml 进行 selenium 的 po 设计
- 几道暑期实习笔试题
- Java自动化测试(selenium 22)