jbpm的入门1--简单实例

来源:互联网 发布:淘宝漏洞群 编辑:程序博客网 时间:2024/05/13 15:01
这里使用的是mysql数据库
开发工具是eclipse
首先我们需要初始化话数据库
Java代码  收藏代码
  1. package test.config;  
  2.   
  3. import org.jbpm.JbpmConfiguration;  
  4.   
  5. public class InitDB {  
  6.   
  7.     public static void main(String[] args) {  
  8.         InitDB initDB = new InitDB();  
  9.         initDB.createJbpmDB();  
  10.     }  
  11.     //初始化JBPM的数据库表  
  12.     public  void createJbpmDB(){  
  13.         JbpmConfiguration.getInstance().createSchema();  
  14.     }  
  15.     //删除JBPM的数据库表  
  16.     public void dropJbpmDB(){  
  17.         JbpmConfiguration.getInstance().dropSchema();  
  18.     }  
  19.   
  20. }  


相关的配置文件 可以在jbpm的程序包中找到
hibernate.cfg.xml要与你的数据库配置相匹配。

接下来我们绘制一个工作流,这里基本上用到jbpm的一个工作流绘制的插件。
我们绘制了一个简单的流程:
大体过程如下
起始状态--》任务1--》任务2--》结束
Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <process-definition  xmlns=""  name="qj">  
  4.   
  5.   
  6.     <start-state name="start-state1">  
  7.         <transition to="apply"></transition>  
  8.     </start-state>  
  9.   
  10.   
  11.     <task-node name="apply">  
  12.         <task name="apply">  
  13.             <assignment actor-id="1"></assignment>  
  14.         </task>  
  15.         <transition to="approve"></transition>  
  16.     </task-node>  
  17.   
  18.     <task-node name="approve">  
  19.         <task name="approve">  
  20.             <assignment actor-id="2"></assignment>  
  21.         </task>  
  22.         <transition to="end-state1"></transition>  
  23.     </task-node>  
  24.   
  25.   
  26.     <end-state name="end-state1"></end-state>  
  27.   
  28.   
  29. </process-definition>  




这里的actor-id 是一个查看权限

现在我们将流程定义发布上去
Java代码  收藏代码
  1. package test.config;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.InputStream;  
  6.   
  7. import org.jbpm.JbpmConfiguration;  
  8. import org.jbpm.JbpmContext;  
  9. import org.jbpm.graph.def.ProcessDefinition;  
  10.   
  11. /** 
  12.  * 部署流程 
  13.  * 
  14.  */  
  15. public class Deploy {  
  16.     public static void main(String[] args) throws FileNotFoundException {  
  17.         JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();  
  18.         //取得流程定义  
  19.         InputStream is = new FileInputStream("D:\\workspace\\fwk\\jbpm\\src\\test\\qj\\processdefinition.xml");  
  20.         ProcessDefinition pd = ProcessDefinition.parseXmlInputStream(is);   
  21.         //部署流程  
  22.         jbpmContext.deployProcessDefinition(pd);  
  23.           
  24.         jbpmContext.close();  
  25.     }  
  26. }  


发布之后我们在数据库中已经可以看到相关的配置了。






下面我们创建一个流程实例。
Java代码  收藏代码
  1. package test;  
  2.   
  3. import org.jbpm.JbpmConfiguration;  
  4. import org.jbpm.JbpmContext;  
  5. import org.jbpm.db.GraphSession;  
  6. import org.jbpm.graph.def.ProcessDefinition;  
  7. import org.jbpm.graph.exe.ProcessInstance;  
  8.   
  9. public class CreatePDInstance {  
  10.   
  11.     /** 
  12.      * @param args 
  13.      */  
  14.     public static void main(String[] args) {  
  15.         JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();  
  16.         GraphSession graphSession = jbpmContext.getGraphSession();  
  17.         //取得流程定义  
  18.         ProcessDefinition pd = graphSession.findLatestProcessDefinition("qj");  
  19.         //创造实例  
  20.         ProcessInstance pi = pd.createProcessInstance();  
  21.         //token下移 刚创建的实例token是指向start-state1,我们需要让token完整这里流程 去指向真正的任务节点  
  22.         pi.signal();  
  23.         //当前token指向apply节点的第一个任务  
  24.         jbpmContext.close();  
  25.     }  
  26.   
  27. }  






signal();方法是将状态进行转换,由于转至第二个状态,所以apply任务在结束完起始状态的时候会被同步创建创建。

由于apply任务是分配给actorId=1进行处理的,下面我们看看autorId=1的任务列表
Java代码  收藏代码
  1. package test;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.jbpm.JbpmConfiguration;  
  6. import org.jbpm.JbpmContext;  
  7. import org.jbpm.taskmgmt.exe.TaskInstance;  
  8.   
  9. public class TaskActor1 {  
  10.   
  11.     /** 
  12.      * @param args 
  13.      */  
  14.     public static void main(String[] args) {  
  15.         TaskActor1 ta1 = new TaskActor1();  
  16.         ta1.showList();  
  17.   
  18.     }  
  19.     public void showList(){  
  20.         JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();  
  21.         String autorId="1";  
  22.         List<TaskInstance> list = jbpmContext.getTaskList(autorId);  
  23.         for(int i = 0 ;i<list.size();i++){  
  24.             TaskInstance ti = list.get(i);  
  25.             System.out.println("ID :" + ti.getId());  
  26.             System.out.println("ActorId :" + ti.getActorId());  
  27.             System.out.println("任务名称 :" + ti.getName());  
  28.             System.out.println("开始时间 :" + ti.getCreate());  
  29.             System.out.println("开始时间 :" + ti.getStart());  
  30.             System.out.println("结束时间 :" + ti.getEnd());  
  31.         }  
  32.     }  
  33. }  

我们可以看到该用户权限下的任务列表
ID :1
ActorId :1
任务名称 :apply
开始时间 :2009-06-25 16:59:05.0
开始时间 :null
结束时间 :null
下面我们开始任务该任务
我的id已经在之前获取到,这里就直接用了,实际应用中则应通过传参获取
Java代码  收藏代码
  1. package test;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.jbpm.JbpmConfiguration;  
  6. import org.jbpm.JbpmContext;  
  7. import org.jbpm.taskmgmt.exe.TaskInstance;  
  8.   
  9. public class TaskActor1 {  
  10.   
  11.     /** 
  12.      * @param args 
  13.      */  
  14.     public static void main(String[] args) {  
  15.         TaskActor1 ta1 = new TaskActor1();  
  16.         //ta1.showList();  
  17.         ta1.startTask(new Long(1));  
  18.     }  
  19.     public void showList(){  
  20.         JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();  
  21.         String autorId="1";  
  22.         List<TaskInstance> list = jbpmContext.getTaskList(autorId);  
  23.         for(int i = 0 ;i<list.size();i++){  
  24.             TaskInstance ti = list.get(i);  
  25.             System.out.println("ID :" + ti.getId());  
  26.             System.out.println("ActorId :" + ti.getActorId());  
  27.             System.out.println("任务名称 :" + ti.getName());  
  28.             System.out.println("开始时间 :" + ti.getCreate());  
  29.             System.out.println("开始时间 :" + ti.getStart());  
  30.             System.out.println("结束时间 :" + ti.getEnd());  
  31.         }  
  32.         jbpmContext.close();  
  33.     }  
  34.     public void startTask(Long i){  
  35.         JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();  
  36.         TaskInstance ti = jbpmContext.loadTaskInstance(i);  
  37.         //如果该任务没有启动就将他启动  
  38.         if(ti.getStart() == null)  
  39.             ti.start();  
  40.         jbpmContext.close();  
  41.         showList();  
  42.     }  
  43. }  

ID :1
ActorId :1
任务名称 :apply
开始时间 :2009-06-25 16:59:05.0
开始时间 :2009-06-25 19:25:52.0
结束时间 :null
此时已经开始
下面我们进行任务的完成
Java代码  收藏代码
  1. package test;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.jbpm.JbpmConfiguration;  
  6. import org.jbpm.JbpmContext;  
  7. import org.jbpm.taskmgmt.exe.TaskInstance;  
  8.   
  9. public class TaskActor1 {  
  10.   
  11.     /** 
  12.      * @param args 
  13.      */  
  14.     public static void main(String[] args) {  
  15.         TaskActor1 ta1 = new TaskActor1();  
  16.         //ta1.showList();  
  17.         //ta1.startTask(new Long(1));  
  18.         ta1.endTask(new Long(1));  
  19.     }  
  20.     public void showList(){  
  21.         JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();  
  22.         String autorId="1";  
  23.         List<TaskInstance> list = jbpmContext.getTaskList(autorId);  
  24.         for(int i = 0 ;i<list.size();i++){  
  25.             TaskInstance ti = list.get(i);  
  26.             System.out.println("ID :" + ti.getId());  
  27.             System.out.println("ActorId :" + ti.getActorId());  
  28.             System.out.println("任务名称 :" + ti.getName());  
  29.             System.out.println("开始时间 :" + ti.getCreate());  
  30.             System.out.println("开始时间 :" + ti.getStart());  
  31.             System.out.println("结束时间 :" + ti.getEnd());  
  32.         }  
  33.         jbpmContext.close();  
  34.     }  
  35.     public void startTask(Long i){  
  36.         JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();  
  37.         TaskInstance ti = jbpmContext.loadTaskInstance(i);  
  38.         //如果该任务没有启动就将他启动  
  39.         if(ti.getStart() == null)  
  40.             ti.start();  
  41.         jbpmContext.close();  
  42.         showList();  
  43.     }  
  44.     public void endTask(Long i){  
  45.         JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();  
  46.         TaskInstance ti = jbpmContext.loadTaskInstance(i);  
  47.         //如果该任务没有完成启动就将他完成  
  48.         if(ti.getEnd() == null)  
  49.             ti.end();  
  50.         jbpmContext.close();  
  51.         showList();  
  52.     }  
  53. }  

完成之后在任务列表中已经没有任务了。
下面我们看一下数据库,第一个任务已经完成,第二个任务已经创建



接下来我们对ActorId=2的任务进行执行,等同上面的,这里不进行重复
Java代码  收藏代码
  1. package test;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.jbpm.JbpmConfiguration;  
  6. import org.jbpm.JbpmContext;  
  7. import org.jbpm.taskmgmt.exe.TaskInstance;  
  8.   
  9. public class TaskActor2 {  
  10.   
  11.     /** 
  12.      * @param args 
  13.      */  
  14.     public static void main(String[] args) {  
  15.         TaskActor2 ta2 = new TaskActor2();  
  16.         ta2.showList();  
  17.         ta2.startTask(new Long(2));  
  18.         ta2.endTask(new Long(2));  
  19.     }  
  20.     public void showList(){  
  21.         JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();  
  22.         String autorId="2";  
  23.         List<TaskInstance> list = jbpmContext.getTaskList(autorId);  
  24.         for(int i = 0 ;i<list.size();i++){  
  25.             TaskInstance ti = list.get(i);  
  26.             System.out.println("ID :" + ti.getId());  
  27.             System.out.println("ActorId :" + ti.getActorId());  
  28.             System.out.println("任务名称 :" + ti.getName());  
  29.             System.out.println("开始时间 :" + ti.getCreate());  
  30.             System.out.println("开始时间 :" + ti.getStart());  
  31.             System.out.println("结束时间 :" + ti.getEnd());  
  32.         }  
  33.         jbpmContext.close();  
  34.     }  
  35.     public void startTask(Long i){  
  36.         JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();  
  37.         TaskInstance ti = jbpmContext.loadTaskInstance(i);  
  38.         //如果该任务没有启动就将他启动  
  39.         if(ti.getStart() == null)  
  40.             ti.start();  
  41.         jbpmContext.close();  
  42.         showList();  
  43.     }  
  44.     public void endTask(Long i){  
  45.         JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();  
  46.         TaskInstance ti = jbpmContext.loadTaskInstance(i);  
  47.         //如果该任务没有完成启动就将他完成  
  48.         if(ti.getEnd() == null)  
  49.             ti.end();  
  50.         jbpmContext.close();  
  51.         showList();  
  52.     }  
  53. }  

当第二个任务执行完成之后,你会看到任务已经整个流程已经完成,db中流程的end字段已经赋值





之所以这样分步来说,就是希望可以深入了解jbpm的执行流程
在实际的项目中往往开始和结束都是同时进行的
比如已经请假(star--填单--审批--end):往往是请假表单的填写的提交的瞬间(创建实例,填写请假单),审批的成功与否也是瞬间而且同时结束流程
即只有两步操作。

0 0
原创粉丝点击