JBPM流程中task,state编程实例

JBPM流程中task,state编程实例

test1.jpdl.xml

Source代码:

<?xml version="1.0" encoding="UTF-8"?>

<process name="test1" xmlns="http://jbpm.org/4.3/jpdl">
<start g="101,40,48,48" name="start1">
<transition g="-52,-7" name="to task1" to="task1"/>
</start>
<task assignee="#{a1}" g="78,116,92,52" name="task1">
<transition g="-31,-17" name="to task4" to="task4"/>
</task>
<state g="392,122,92,52" name="state1">
<transition g="-59,-17" name="to state2" to="state2"/>
</state>
<state g="394,235,92,52" name="state2">
<transition g="-22,-21" name="to task2" to="task2"/>
</state>
<task assignee="#{a1}" g="237,234,92,52" name="task2">
<transition g="-59,-17" name="to state3" to="state3"/>
</task>
<end g="102,336,48,48" name="end1"/>
<task assignee="#{a1}" g="229,119,92,52" name="task4">
<transition g="-25,-20" name="to state1" to="state1"/>
</task>
<state g="239,335,92,52" name="state3">
<transition name="to end1" to="end1" g="-44,10"/>
</state>
</process>

程序测试代码:
import org.jbpm.api.*;
import org.jbpm.api.task.*;
import java.util.*;
public class T1 {

public ProcessEngine processEngine;
public RepositoryService rs;
public ExecutionService es;
public TaskService ts;
public String deployId;
public ProcessInstance processInstance;
public String user;
public T1()
{
processEngine=Configuration.getProcessEngine();

}
public void setUp(String a)
{
rs=processEngine.getRepositoryService();
deployId=rs.createDeployment().addResourceFromClasspath("test1.jpdl.xml").deploy();
es=processEngine.getExecutionService();
ts=processEngine.getTaskService();
Map<String,Object> map = new HashMap<String,Object> ();
user=a;
map.put("a1", user);
processInstance=es.startProcessInstanceByKey("test1",map);
System.out.println("创建流程实例的返回值:"+processInstance);//实际是创建一个流向---execution[test1.7]
}
public void testInstancce()//测试流程实例
{
//System.out.println("创建流程实例的当前节点:"+processInstance.findActiveActivityNames());//返回类中变量的值,但是没有经过更新,所以总维持一个值。
List<ProcessInstance> pilist=es.createProcessInstanceQuery().list(); //查看有多少个流程实例(流向)
for(ProcessInstance pi:pilist)//遍历每一个流向里面的节点信息
{
System.out.println("流程实例ID:"+pi.getId());
System.out.println("流程实例findActiveActivityNames():"+pi.findActiveActivityNames());
System.out.println("流程实例findActiveExecutionIn()"+pi.findActiveExecutionIn("task1"));//找到当前活动是在哪一个流程指向中
System.out.println("流程实例GetName():"+pi.getName());
System.out.println("流程实例GetKey():"+pi.getKey());
}
}
public void endTask(String a)//完成task,继续流程
{

user=a;
List<Task> tasklist=ts.findPersonalTasks(user);
for(Task task : tasklist)
{
System.out.printf("待办任务:"+task.getName());
ts.completeTask(task.getId());
}
}
public void signal()//触发state,继续流程
{
List<ProcessInstance> pilist1=es.createProcessInstanceQuery().list();
for(ProcessInstance pi:pilist1)
{
pi=es.signalExecutionById(pi.getId());
System.out.println("流程是否结束:"+pi.isEnded());//查看当前processInstance流程实例的结束情况
}
}
public void delete()//级联删除流程
{
rs.deleteDeploymentCascade(deployId);
System.out.print("!!!!!!!!!!!删除!!!!!!!!!!!!!");
}

public static void main(String[] args) {
System.out.print("用户1:");
Scanner scan1=new Scanner(System.in);
String user1=scan1.next();
/*
System.out.print("用户2:");//可以对用户2和1一同测试,这里为了突出结果,只测试用户1
Scanner scan2=new Scanner(System.in);
String user2=scan2.next();
*/
T1 t=new T1();
t.setUp(user1);
for(int i=0;i<4;i++)
{
t.testInstancce();
t.endTask(user1);
}
t.signal();
for(int i=0;i<2;i++)
{
t.testInstancce();
t.endTask(user1);
}
t.signal();
for(int i=0;i<2;i++)
{
t.testInstancce();
t.endTask(user1);
}
t.signal();
for(int i=0;i<2;i++)
{
t.testInstancce();
t.endTask(user1);
}
t.delete();
}
}
/*
----------测试结果------------
用户1:a
创建流程实例的返回值:execution[test1.7]
************************************
流程实例ID:test1.7
流程实例findActiveActivityNames():[task1]
流程实例findActiveExecutionIn()execution[test1.7]
流程实例GetName():null
流程实例GetKey():null
待办任务:task1
************************************
流程实例ID:test1.7
流程实例findActiveActivityNames():[task4]
流程实例findActiveExecutionIn()null
流程实例GetName():null
流程实例GetKey():null
待办任务:task4
*************************************
流程实例ID:test1.7
流程实例findActiveActivityNames():[state1]
流程实例findActiveExecutionIn()null
流程实例GetName():null
流程实例GetKey():null
*************************************
-----------停在了state1-----------
流程实例ID:test1.7
流程实例findActiveActivityNames():[state1]
流程实例findActiveExecutionIn()null
流程实例GetName():null
流程实例GetKey():null
**************************************
流程是否结束:false---->是由signal方法触发的
流程实例ID:test1.7
流程实例findActiveActivityNames():[state2]
流程实例findActiveExecutionIn()null
流程实例GetName():null
流程实例GetKey():null
**************************************
-----------停在了state2-----------
流程实例ID:test1.7
流程实例findActiveActivityNames():[state2]
流程实例findActiveExecutionIn()null
流程实例GetName():null
流程实例GetKey():null
***************************************
流程是否结束:false
流程实例ID:test1.7
流程实例findActiveActivityNames():[task2]
流程实例findActiveExecutionIn()null
流程实例GetName():null
流程实例GetKey():null
待办任务:task2
***************************************
流程实例ID:test1.7
流程实例findActiveActivityNames():[state3]
流程实例findActiveExecutionIn()null
流程实例GetName():null
流程实例GetKey():null
流程是否结束:true
!!!!!!!!!!!删除!!!!!!!!!!!!!

*/