欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jBPM开发入门指南(4)

程序员文章站 2022-03-24 11:37:24
...
jBPM开发入门指南(4)
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());

}



}

这个例子还是很简单,而且关键是缺少用户、组、权限等工作流系统必须的东西,不过没关系。下面的内容我将完成一个更完整的实例。