jBPM开发入门指南(4)
程序员文章站
2022-03-24 11:37:24
...
7 jBPM 的客户端开发
有了前面的 HelloWorld 后台流程,我们就要开始客户端程序了。正如前面提到的,本文不写 JSP ,而改采用 JUnit 的形式,输出则用 System.out.println 。举一反三,知道在方法中输入及用 println 输出,在 JSP 和 SWING 等 GUI 界面还不是一样嘛。
这个 JUnit 客户端,我们就借用创建项目时自动生成的 SimpleProcessTest.java 了,改写后如下:
packagecom.sample;
importjunit.framework.TestCase;
importorg.jbpm.JbpmConfiguration;
importorg.jbpm.JbpmContext;
importorg.jbpm.context.exe.ContextInstance;
importorg.jbpm.graph.def.ProcessDefinition;
importorg.jbpm.graph.exe.ProcessInstance;
publicclassSimpleProcessTestextendsTestCase{
privateJbpmConfigurationconfig=JbpmConfiguration.getInstance();
privateJbpmContextctx=config.createJbpmContext();
//helloworld对应于jbpm_processdefinition表的name字段值,也即processdefinition.xml的name
//这个值得取比较耗时,实际项目里最好和“数据库的JDBC连接”一样,让它共享,不要频繁打开关闭。
privateProcessDefinitionprocessDefinition=ctx.getGraphSession().findLatestProcessDefinition("helloworld");
publicvoidtestNewRequest(){
longid=newRequest();
System.out.println("id="+id);
checkNewRequest(id);
confirmRequest(id);
checkconfirmRequest(id);
ctx.close();//关闭jbpm容器
}
/**
*创建一个请假单
*
*@return
*/
privatelongnewRequest(){
//创建一个新流程
ProcessInstancepi=processDefinition.createProcessInstance();
//取得流程的数据环境
ContextInstanceci=pi.getContextInstance();
//创建一张请假单
ci.setVariable("name","陈刚www.chengang.com.cn");
ci.setVariable("day",2);
assertEquals(null,ci.getVariable("note"));
//请假申请结束,转到下一个流程结点
pi.signal();
returnpi.getId();
}
/**
*检查请假单的数据
*
*@paramid
*/
privatevoidcheckNewRequest(longid){
//从数据库提取原流程
ProcessInstancepi=ctx.loadProcessInstance(id);
//取得流程的数据环境
ContextInstanceci=pi.getContextInstance();
//创建一张请假单
assertEquals("陈刚www.chengang.com.cn",ci.getVariable("name"));
assertEquals(Integer.valueOf(2),ci.getVariable("day"));
assertEquals("我要请假",ci.getVariable("note"));
//当前是结点为confirm
assertEquals(pi.getRootToken().getNode().getName(),"confirm");
//流程还没结束
assertFalse(pi.hasEnded());
}
/**
*审批陈刚的请假申请
*
*@paramid
*/
privatevoidconfirmRequest(longid){
ProcessInstancepi=ctx.loadProcessInstance(id);
ContextInstanceci=pi.getContextInstance();
//不通过
ci.setVariable("note","不准请假,继续加班");
//审批结束,到下一个流程结点
pi.signal();
}
privatevoidcheckConfirmRequest(longid){
ProcessInstancepi=ctx.loadProcessInstance(id);
ContextInstanceci=pi.getContextInstance();
//ConfirmAction类在signal后执行,所以覆盖了经理的审批意见
assertEquals("准假",ci.getVariable("note"));
//当前是结点为end
assertEquals(pi.getRootToken().getNode().getName(),"end");
//流程结束了
assertTrue(pi.hasEnded());
}
}
importjunit.framework.TestCase;
importorg.jbpm.JbpmConfiguration;
importorg.jbpm.JbpmContext;
importorg.jbpm.context.exe.ContextInstance;
importorg.jbpm.graph.def.ProcessDefinition;
importorg.jbpm.graph.exe.ProcessInstance;
publicclassSimpleProcessTestextendsTestCase{
privateJbpmConfigurationconfig=JbpmConfiguration.getInstance();
privateJbpmContextctx=config.createJbpmContext();
//helloworld对应于jbpm_processdefinition表的name字段值,也即processdefinition.xml的name
//这个值得取比较耗时,实际项目里最好和“数据库的JDBC连接”一样,让它共享,不要频繁打开关闭。
privateProcessDefinitionprocessDefinition=ctx.getGraphSession().findLatestProcessDefinition("helloworld");
publicvoidtestNewRequest(){
longid=newRequest();
System.out.println("id="+id);
checkNewRequest(id);
confirmRequest(id);
checkconfirmRequest(id);
ctx.close();//关闭jbpm容器
}
/**
*创建一个请假单
*
*@return
*/
privatelongnewRequest(){
//创建一个新流程
ProcessInstancepi=processDefinition.createProcessInstance();
//取得流程的数据环境
ContextInstanceci=pi.getContextInstance();
//创建一张请假单
ci.setVariable("name","陈刚www.chengang.com.cn");
ci.setVariable("day",2);
assertEquals(null,ci.getVariable("note"));
//请假申请结束,转到下一个流程结点
pi.signal();
returnpi.getId();
}
/**
*检查请假单的数据
*
*@paramid
*/
privatevoidcheckNewRequest(longid){
//从数据库提取原流程
ProcessInstancepi=ctx.loadProcessInstance(id);
//取得流程的数据环境
ContextInstanceci=pi.getContextInstance();
//创建一张请假单
assertEquals("陈刚www.chengang.com.cn",ci.getVariable("name"));
assertEquals(Integer.valueOf(2),ci.getVariable("day"));
assertEquals("我要请假",ci.getVariable("note"));
//当前是结点为confirm
assertEquals(pi.getRootToken().getNode().getName(),"confirm");
//流程还没结束
assertFalse(pi.hasEnded());
}
/**
*审批陈刚的请假申请
*
*@paramid
*/
privatevoidconfirmRequest(longid){
ProcessInstancepi=ctx.loadProcessInstance(id);
ContextInstanceci=pi.getContextInstance();
//不通过
ci.setVariable("note","不准请假,继续加班");
//审批结束,到下一个流程结点
pi.signal();
}
privatevoidcheckConfirmRequest(longid){
ProcessInstancepi=ctx.loadProcessInstance(id);
ContextInstanceci=pi.getContextInstance();
//ConfirmAction类在signal后执行,所以覆盖了经理的审批意见
assertEquals("准假",ci.getVariable("note"));
//当前是结点为end
assertEquals(pi.getRootToken().getNode().getName(),"end");
//流程结束了
assertTrue(pi.hasEnded());
}
}
这个例子还是很简单,而且关键是缺少用户、组、权限等工作流系统必须的东西,不过没关系。下面的内容我将完成一个更完整的实例。
上一篇: 深入了解MySQL中的事务和锁
下一篇: Cause: org.xml.sax.SAXParseException; lineNumber: x; columnNumber: x; 元素内容必须由格式正确的字符数据或标记组成。
推荐阅读
-
零基础小白入门IT开发指南
-
初学者的福音:游戏开发新手入门指南
-
iOS开发之Swift 4 JSON 解析指南
-
Express进阶之log4js实用入门指南
-
Angular开发者指南之入门介绍
-
关于 HSSF 和 XSSF 功能的开发者入门指南 (Apache POI 操作 Excel)
-
MaxCompute(原ODPS)开发入门指南——数据上云篇 阿里巴巴sqljava数据挖掘
-
《算法笔记上机实验指南》第4章 入门篇(2)---算法初步 5.6大整数运算
-
WinForm界面控件开发入门指南 - 自定义打印外观 XtraGriddevexpressc#.net
-
【golang-GUI开发】QSS的使用(一)———QSS入门指南