转http://linliangyi2007.javaeye.com/blog/176345
本片文章,我们将从业务流程的设计开始,通过带领大家完成一个完整工作流的程序设计,来学习jPDL的使用。
业务流程设计
这里我们实现一个相对简化的公司借款申请流程。流程图如下:
在jPDL中,与流程设计相关的文件有三个:processdefinition.xml、gdp.xml、processimage.jpg。
其中processdefinition.xml是流程定义的描述文件;gpd.xml是对图形界面呈现的XML描述;而
processimage.jpg则是对图形界面的快照。下面我们将展示本样例的流程定义文件。

public class FirstFlowProcessTest extends TestCase {
ProcessDefinition pdf ;
ProcessInstance pi;
public void test4000YuanApplication() throws Exception {
deployProcessDefinition();
createProcessInstance("linly");
submitApplication(4000);
approveByManager(true);
checkTasks();
}
public void test6000YuanApplication() throws Exception {
deployProcessDefinition();
createProcessInstance("linly");
submitApplication(6000);
approveByManager(true);
approveByPresident(true);
checkTasks();
}
public void test7000YuanApplication() throws Exception {
deployProcessDefinition();
createProcessInstance("linly");
submitApplication(7000);
approveByManager(true);
approveByPresident(false);
checkTasks();
}
/**
* 部署流程定义
* @throws Exception
*/
protected void deployProcessDefinition() throws Exception{
System.out.println("==FirstFlowProcessTest.deployProcessDefinition()==");
pdf = ProcessDefinition.parseXmlResource("firstflow/processdefinition.xml");
assertNotNull("Definition should not be null", pdf);
}
/**
* 生成流程实例
*/
protected void createProcessInstance(String user){
System.out.println("==FirstFlowProcessTest.createProcessInstance()==");
assertNotNull("Definition should not be null", pdf);
//生成实例
pi = pdf.createProcessInstance();
assertNotNull("processInstance should not be null", pi);
//设置流程发起人
pi.getContextInstance().createVariable("initiator", user);
//触发流程转向
pi.signal();
}
/**
* 填写提交申请单
* @param money
*/
protected void submitApplication(int money){
System.out.println("==FirstFlowProcessTest.submitApplication()==");
TaskInstance ti = (TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator() .next() ;
System.out.println("ti.actor = " + ti.getActorId());
ContextInstance ci = ti.getContextInstance();
ci.setVariable("money",new Integer(money));
ti.end();
}
/**
* 部门经理审批
* @param pass
*/
@SuppressWarnings("unchecked")
protected void approveByManager(boolean pass){
System.out.println("==FirstFlowProcessTest.approveByManager()==");
Iterator it = pi.getTaskMgmtInstance().getTaskInstances().iterator();
for( ;it.hasNext(); ){
TaskInstance ti = it.next();
if(ti.getActorId().equals("DepartmentManager")){
List transitions = ti.getToken().getNode().getLeavingTransitions();
for(Transition t : transitions){
System.out.println("----Transition" + t.getName());
}
assertEquals("DepartmentManager",ti.getActorId());
if(pass){
ti.end("部门经理审批通过");
}else{
ti.end("部门经理驳回");
}
return;
}
}
}
/**
* 总经理审批
* @param pass
*/
@SuppressWarnings("unchecked")
protected void approveByPresident(boolean pass){
System.out.println("==FirstFlowProcessTest.approveByPresident()==");
Iterator it = pi.getTaskMgmtInstance().getTaskInstances().iterator();
for( ;it.hasNext(); ){
TaskInstance ti = it.next();
if(ti.getActorId().equals("President")){
List transitions = ti.getToken().getNode().getLeavingTransitions();
for(Transition t : transitions){
System.out.println("----Transition" + t.getName());
}
assertEquals("President",ti.getActorId());
if(pass){
ti.end("总经理审批通过");
}else{
ti.end("总经理驳回");
}
return;
}
}
}
/**
* 打印任务记录
*/
@SuppressWarnings("unchecked")
protected void checkTasks(){
System.out.println("==FirstFlowProcessTest.checkTasks()==");
Collection coll = pi.getTaskMgmtInstance().getTaskInstances();
System.out.println("====Process has task:====");
for(TaskInstance ti : coll){
System.out.println("=="+ti.getName()+"==");
System.out.println("=="+ti.getActorId()+"==");
System.out.println("=="+ti.getVariables().toString() +"==");
}
System.out.println("====end====");
}
ProcessDefinition.parseXmlResource("firstflow/processdefinition.xml")
代码说明:
//生成实例
pi = pdf.createProcessInstance();
assertNotNull("processInstance should not be null", pi);
//设置流程发起人
pi.getContextInstance().createVariable("initiator", user);
//触发流程转向
pi.signal();
代码说明:
/**
* 填写提交申请单
* @param money
*/
protected void submitApplication(int money){
System.out.println("==FirstFlowProcessTest.submitApplication()==");
TaskInstance ti = (TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator() .next()
System.out.println("ti.actor = " + ti.getActorId());
ContextInstance ci = ti.getContextInstance();
ci.setVariable("money",new Integer(money));
ti.end();
}
代码说明:
/**
* 部门经理审批
* @param pass
*/
@SuppressWarnings("unchecked")
protected void approveByManager(boolean pass){
System.out.println("==FirstFlowProcessTest.approveByManager()==");
Iterator it = pi.getTaskMgmtInstance().getTaskInstances().iterator();
for( ;it.hasNext(); ){
TaskInstance ti = it.next();
if(ti.getActorId().equals("DepartmentManager")){
List transitions = ti.getToken().getNode().getLeavingTransitions();
for(Transition t : transitions){
System.out.println("----Transition" + t.getName());
}
assertEquals("DepartmentManager",ti.getActorId());
if(pass){
ti.end("部门经理审批通过");
}else{
ti.end("部门经理驳回");
}
return;
}
}
}
代码说明:
/**
* 总经理审批
* @param pass
*/
@SuppressWarnings("unchecked")
protected void approveByPresident(boolean pass){
System.out.println("==FirstFlowProcessTest.approveByPresident()==");
Iterator it = pi.getTaskMgmtInstance().getTaskInstances().iterator();
for( ;it.hasNext(); ){
TaskInstance ti = it.next();
if(ti.getActorId().equals("President")){
List transitions = ti.getToken().getNode().getLeavingTransitions();
for(Transition t : transitions){
System.out.println("----Transition" + t.getName());
}
assertEquals("President",ti.getActorId());
if(pass){
ti.end("总经理审批通过");
}else{
ti.end("总经理驳回");
}
return;
}
}
}
代码说明:
public class FirstFlowProcessDBTest {
/*
* 初始化jBPM配置
* 包含对Hibernate的数据库初始化
*/
static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
public static void main(String[] args){
FirstFlowProcessDBTest test = new FirstFlowProcessDBTest();
test.test4000YuanApplication();
test.test6000YuanApplication();
test.test7000YuanApplication();
}
public void test4000YuanApplication(){
ProcessInstance pi = createProcessInstance("linly");
submitApplication("linly" , 4000);
approveByManager(true);
checkTasks(pi);
}
public void test6000YuanApplication() {
ProcessInstance pi = createProcessInstance("linly");
submitApplication("linly" , 6000);
approveByManager(true);
approveByPresident(true);
checkTasks(pi);
}
public void test7000YuanApplication() {
ProcessInstance pi = createProcessInstance("linly");
submitApplication("linly" , 7000);
approveByManager(true);
approveByPresident(false);
checkTasks(pi);
}
/**
* 生成流程实例
*/
protected ProcessInstance createProcessInstance(String user){
System.out.println("==FirstFlowProcessTest.createProcessInstance()==");
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
GraphSession graphSession = jbpmContext.getGraphSession();
/*
* 从数据库获取指定的流程定义
*/
ProcessDefinition pdf = graphSession.findLatestProcessDefinition("simple");
//生成流程实例
ProcessInstance pi = pdf.createProcessInstance();
//设置流程发起人
pi.getContextInstance().createVariable("initiator", user);
//触发流程转向
pi.signal();
/*
* 保存流程实例
*/
jbpmContext.save(pi);
return pi;
}finally{
jbpmContext.close();
}
}
/**
* 填写提交申请单
* @param money
*/
@SuppressWarnings("unchecked")
protected void submitApplication(String actorId , int money){
System.out.println("==FirstFlowProcessTest.submitApplication()==");
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
/*
*根据操作者ID,获取属于该操作者的任务集
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12058779/viewspace-1006094/ ,如需转载,请注明出处,否则将追究法律责任。