JBPM工作流<转>

JBPM之流程定义管理,流程执行管理
      其实,我们学习JBPM框架的时候,只要弄懂了什么是JBPM的流程定义,流程执行的管理,那么我们在OA做流转审批的时候,就直接可以来用JBPM了,只需要通过Spring来整合一下就行了。那么下面来说一下吧。
      1.什么是JBPM?
       jBPM(JBoss Business Process Management业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。JBPM具有很强的灵活性,他可以应用的桌面程序,也可以应用的Web服务,而且提供了一种图形化的业务分析建模工具,并可以将这些业务模型部署的数据库中,任务实例的执行也可以被持久化。
     2.JBPM可以来做什么?
       业务流程 UML 图形化,定义 控制流程跳转, 分派任务 定时,执行任务, 事件处理等等
     3.  JBPM入门:
      在了解JBPM的时候,我们首先要明白一个概念,那就是什么是流程图? 一个流程图是由节点(Node)和转换(Transition)组成的。一个流程就是一个有向图,流程图有多种表示方式:XML,Java,数据库中的记录。那么有哪些节点呢? 比如start节点(流程的入口),end节点(流程的结束),state节点(状态节点),我用下面很好的一张图来说明一下,大家看着图就很清楚了。
    
一个流程图
     像流程图这个,一般都是给用户看的,而让电脑识别的是xml文件,eclipse中安装JBPM插件后,我们画上流程图结构示意图之后,相应的xml文件会自动生成,这个我们不用自己写。
     下面就说说,有了xml文件(也就是表示了让服务器识别xml文件)之后,我们就在java代码中如何定义一个流程,如何对流程定义进行管理,这里我贴出代码来。
[java]  view plain copy print ?
  1. <span style="font-size:14px">/** 
  2.  * 管理流程(流程定义) 
  3.  * @author tyg 
  4.  * 
  5.  */  
  6. public class ProcessDefinitionManage {  
  7.   
  8.     // private ProcessEngine processEngine = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();  
  9.     private ProcessEngine processEngine = Configuration.getProcessEngine(); // 获取单例的ProcessEngine对象,使用的是默认的配置文件(jbpm.cfg.xml)  
  10.   
  11.     // 1,部署流程定义(添加)  
  12.     @Test  
  13.     public void deploy_1() {  
  14.         String deploymentId = processEngine.getRepositoryService()//  
  15.                 .createDeployment()//  
  16.                 .addResourceFromClasspath("helloworld/test.jpdl.xml")//  
  17.                 .addResourceFromClasspath("helloworld/test.png")//  
  18.                 .deploy();  
  19.         System.out.println("deploymentId = " + deploymentId);  
  20.     }  
  21.   
  22.     // 一次添加多个资源(zip)  
  23.     @Test  
  24.     public void deploy_2() {  
  25.         // 找到zip文件  
  26.         InputStream in = this.getClass().getClassLoader().getResourceAsStream("helloworld/helloworld.zip");  
  27.         ZipInputStream zipInputStream = new ZipInputStream(in);  
  28.   
  29.         // 部署  
  30.         String deploymentId = processEngine.getRepositoryService()//  
  31.                 .createDeployment()//  
  32.                 .addResourcesFromZipInputStream(zipInputStream)//  
  33.                 .deploy();  
  34.         System.out.println("deploymentId = " + deploymentId);  
  35.     }  
  36.   
  37.     // 2,查询所有流程定义  
  38.     @Test  
  39.     public void findAll() {  
  40.         // 查询  
  41.         List<ProcessDefinition> list = processEngine.getRepositoryService()//  
  42.                 .createProcessDefinitionQuery()//  
  43.                 .orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)//  
  44.                 .list();  
  45.   
  46.         // 显示  
  47.         for (ProcessDefinition pd : list) {  
  48.             System.out.println("id=" + pd.getId()// 格式为:{key}-{version}  
  49.                     + ", name=" + pd.getName()// 流程定义文件(.jpdl.xml)中根元素的name属性的值  
  50.                     + ", key=" + pd.getKey()// 流程定义文件(.jpdl.xml)中根元素的key属性的值,可以不写,不写就是name属性的值  
  51.                     + ", version=" + pd.getVersion()// 流程定义文件(.jpdl.xml)中根元素的version属性的值,可以不写,不写就会自增(key相同时,版本加1)  
  52.                     + ", deploymentId=" + pd.getDeploymentId()); // 本流程定义对应的 .jpdl.xml 文件所属的Deployment对象的id  
  53.         }  
  54.     }  
  55.   
  56.     // 查询所有最新版本的流程定义  
  57.     @Test  
  58.     public void findAllLatestVersions() {  
  59.         // 1,查询所有流程定义,按Version升序排列,这样所有最大的版本就都排到最后了  
  60.         List<ProcessDefinition> allList = processEngine.getRepositoryService()//  
  61.                 .createProcessDefinitionQuery()//  
  62.                 .orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)//  
  63.                 // .processDefinitionName("test")//  
  64.                 // .orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)//  
  65.                 // .orderDesc(ProcessDefinitionQuery.PROPERTY_KEY)//  
  66.                 // .uniqueResult()  
  67.                 // .count()  
  68.                 // .page(firstResult, maxResults)  
  69.                 .list();  
  70.   
  71.         // 2,过滤出所需的最新版本的流程定义  
  72.         Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>();  
  73.         for (ProcessDefinition pd : allList) {  
  74.             map.put(pd.getKey(), pd);  
  75.         }  
  76.   
  77.         // 显示  
  78.         for (ProcessDefinition pd : map.values()) {  
  79.             System.out.println("id=" + pd.getId()// 格式为:{key}-{version}  
  80.                     + ", name=" + pd.getName()// 流程定义文件(.jpdl.xml)中根元素的name属性的值  
  81.                     + ", key=" + pd.getKey()// 流程定义文件(.jpdl.xml)中根元素的key属性的值,可以不写,不写就是name属性的值  
  82.                     + ", version=" + pd.getVersion()// 流程定义文件(.jpdl.xml)中根元素的version属性的值,可以不写,不写就会自增(key相同时,版本加1)  
  83.                     + ", deploymentId=" + pd.getDeploymentId()); // 本流程定义对应的 .jpdl.xml 文件所属的Deployment对象的id  
  84.         }  
  85.     }  
  86.   
  87.     // 3,删除流程定义(其实是删除Deployment)  
  88.     @Test  
  89.     public void deleteById() {  
  90.         String deploymentId = "1";  
  91.         // // 删除某Deployment,如果有关联的执行信息,就抛异常  
  92.         // processEngine.getRepositoryService().deleteDeployment(deploymentId);  
  93.         // 删除某Deployment,如果有关联的执行信息,就级联删除  
  94.         processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);  
  95.     }  
  96.   
  97.     // 删除指定key的所有版本的流程定义  
  98.     @Test  
  99.     public void deleteByKey() {  
  100.         // 1,查询出指定key的所有版本的流程定义  
  101.         List<ProcessDefinition> list = processEngine.getRepositoryService()//  
  102.                 .createProcessDefinitionQuery()//  
  103.                 .processDefinitionKey("helloworld")//  
  104.                 .list();  
  105.   
  106.         // 2,循环删除  
  107.         for (ProcessDefinition pd : list) {  
  108.             processEngine.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());  
  109.         }  
  110.     }</span>  


     当我们部署流程定义文件后,剩下的就是流程的执行,任务的完成,只要弄对流程执行的管理之后,相信大家就能够对JBPM就有所认识了。
[java]  view plain copy print ?
  1. /** 
  2.  * 执行流程(流程实例) 
  3.  * @author tyg 
  4.  * 
  5.  */  
  6. public class ProcessInstanceExecute {  
  7.   
  8.     private ProcessEngine processEngine = Configuration.getProcessEngine();  
  9.   
  10.     // 启动流程实例  
  11.     @Test  
  12.     public void startProcessInstance() {  
  13.         // 使用指定key的最新版本的流程定义启动流程实例  
  14.         ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");  
  15.   
  16.         System.out.println("id=" + pi.getId()//  
  17.                 + ", state=" + pi.getState()//  
  18.                 + ", processDefinitionId=" + pi.getProcessDefinitionId());  
  19.     }  
  20.   
  21.     // 查询我的未办理完的任务列表  
  22.     @Test  
  23.     public void findMyTaskList() {  
  24.         // String userId = "员工";  
  25.         // String userId = "部门经理";  
  26.         String userId = "总经理";  
  27.   
  28.         // 查询我所有未办理的任务的列表  
  29.         // List<Task> list = processEngine.getTaskService().findPersonalTasks(userId);  
  30.         // 分页的查询  
  31.         List<Task> list = processEngine.getTaskService()//  
  32.                 .createTaskQuery()//  
  33.                 .assignee(userId)//  
  34.                 .list();  
  35.   
  36.         // 显示  
  37.         System.out.println("【未办理的任务列表如下】");  
  38.         for (Task t : list) {  
  39.             System.out.println("id=" + t.getId()//  
  40.                     + ", name=" + t.getName()// 任务的名称  
  41.                     + ", assignee=" + t.getAssignee()// 任务的办理人  
  42.                     + ", createTime=" + t.getCreateTime()// 任务的创建时间  
  43.                     + ", executionId=" + t.getExecutionId()); // 所属的执行对象的id  
  44.         }  
  45.     }  
  46.   
  47.     // 办理任务  
  48.     @Test  
  49.     public void completeTask() {  
  50.         String taskId = "120001";  
  51.         processEngine.getTaskService().completeTask(taskId);  
  52.     }  
  53. }  
     转自:http://blog.csdn.net/shuishou113/article/details/13296463
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值