工作流框架JBPM的基本应用

来源:互联网 发布:js onclick事件 编辑:程序博客网 时间:2024/05/01 19:36

转载来自:http://blog.csdn.net/ankeyuan/article/details/38705661

工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。

工作流管理系统(WfMS,Workflow Management System)的主要功能是通过计算机技术的支持去定义、执行和管理工作流,协调工作流执行过程中工作之间以及群体成员之间的信息交互。工作流需要依靠工作流管理系统来实现。工作流管理系统是定义、创建、执行工作流的系统,应能提供以下三个方面的功能支持:
1. 定义工作流:包括具体的活动、规则等
2. 运行控制功能:在运行环境中管理工作流过程,对工作流过程中的活动进行调度
3. 运行交互功能:指在工作流运行中,WfMS与用户(活动的参与者)及外部应用程序工具交互的功能。

一、管理流程

部署(添加)
删除
查询(查询所有、自定义条件查询)
获取部署添加的文件信息(查看流程图)
* 没有更新操作!策略为:重新部署 + 版本递增。

二、执行流程
启动流程实例
查询我的任务列表
办理任务
直接向后执行一步

===========================================
部署对象 Deployment
表示一次部署的多个文件的信息。
对应的表:
jbpm4_deployment
jbpm4_lob

流程定义 ProcessDefinition
表示一个工作流程,包含每个环节的详细信息。
这是解析.jpdl.xml文件得到的数据。
此类没有对应的表,他对应的是.jpdl.xml文件。

执行对象 Execution
表示一个执行的路径(分支)。最大的分支就是从Start到End的那个。
最大的分支称为Root Execution 也称为 ProcessInstance。
对应的表:
jbpm4_execution正在执行的信息表
jbpm4_hist_procinst已经执行完的历史信息表

流程实例 ProcessInstance
表示按某流程定义执行的所有执行时的信息。
ProcessInstance就是Execution对象(的子类型)

任务 Task
在执行流程的过程中,在Task环节生成的任务信息。
对应的表:
jbpm4_task 正在执行的信息表

jbpm4_hist_task已经执行完的历史信息表


示例代码:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 管理流程定义有关的操作 
  3.  *  部署(添加) 
  4.  *  删除 
  5.  *  查询(查询所有、自定义条件查询) 
  6.  *  获取部署添加的文件信息(查看流程图) 
  7.  *  !!没有更新操作!策略为:重新部署 + 版本递增。 
  8.  *  
  9.  */  
  10. public class ProcessDefinitionTest {  
  11.         // 返回单例的ProcessEngine实例,使用的是默认的配置文件(jbpm.cfg.xml)  
  12.     private ProcessEngine processEngine = Configuration.getProcessEngine();  
  13.   
  14.     // 部署(添加)  
  15.     @Test  
  16.     public void testDeploy() throws Exception {  
  17.         String deploymentId = processEngine.getRepositoryService()//  
  18.                 .createDeployment()// 创建一个部署对象  
  19.                 .addResourceFromClasspath("helloworld/helloworld.jpdl.xml")// 添加一个要部署的文件  
  20.                 .addResourceFromClasspath("helloworld/helloworld.png")// 添加一个要部署的文件  
  21.                 .deploy(); // 执行部署操作  
  22.         System.out.println("部署成功:deploymentId = " + deploymentId);  
  23.     }  
  24.   
  25.     // 部署(把多个文件打包为一个zip一起部署)  
  26.     @Test  
  27.     public void testDeploy_zip() throws Exception {  
  28.         // 准备  
  29.         ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream("d:/helloworld.zip"));  
  30.           
  31.         // 部署  
  32.         String deploymentId = processEngine.getRepositoryService()//  
  33.                 .createDeployment()// 创建一个部署对象  
  34.                 .addResourcesFromZipInputStream(zipInputStream)// 指定zip流  
  35.                 .deploy(); // 执行部署操作  
  36.         System.out.println("部署成功:deploymentId = " + deploymentId);  
  37.     }  
  38.   
  39.       
  40.     // 删除  
  41.     @Test  
  42.     public void testDelete() throws Exception {  
  43.         // // 删除指定的部署对象,如果有关联的信息,就报错  
  44.         // processEngine.getRepositoryService().deleteDeployment(deploymentId);  
  45.         // // 删除指定的部署对象,如果有关联的信息,就一并删除  
  46.         // processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);  
  47.   
  48.         String deploymentId = "40001";  
  49.         processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);  
  50.     }  
  51.   
  52.     // 查询流程定义(查询所有、自定义条件查询)  
  53.     @Test  
  54.     public void testFindAllProcessDefinition() throws Exception {  
  55.         // 查询  
  56.         List<ProcessDefinition> list = processEngine.getRepositoryService()//  
  57.                 .createProcessDefinitionQuery()//  
  58.                 // 过滤条件  
  59.                 // .processDefinitionId(processDefinitionId);  
  60.                 // .deploymentId(deploymentId)  
  61.                 // .processDefinitionKey(key)  
  62.                 // .processDefinitionName(name)  
  63.                 // 排序条件  
  64.                 // .orderAsc(property)  
  65.                 // .orderDesc(property)  
  66.                 // .orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)//  
  67.                 // 执行查询得到结果  
  68.                 // .page(firstResult, maxResults)  
  69.                 // .list()  
  70.                 // .count()  
  71.                 // .uniqueResult()  
  72.                 .list();  
  73.   
  74.         // 显示  
  75.         for (ProcessDefinition pd : list) {  
  76.             System.out.println("id=" + pd.getId()// 格式为:{key}-{version}  
  77.                     + ", name=" + pd.getName()// .jpdl.xml中根元素的name属性的值。  
  78.                     + ", key=" + pd.getKey()// .jpdl.xml中根元素的key属性的值。如果不写,默认为name属性的值。  
  79.                     + ", version=" + pd.getVersion()// .jpdl.xml中根元素的version属性的值。如果不写,默认的效果为同名称的第一个version为1,以后的就递增。(一般不要写)  
  80.                     + ", deploymentId=" + pd.getDeploymentId()); // 所属的部署对象的id  
  81.         }  
  82.     }  
  83.   
  84.     // 获取部署时添加的文件信息(查看流程图)  
  85.     @Test  
  86.     public void testGetProcessImage() throws Exception {  
  87.         String deploymentId = "50001";  
  88.         String resourceName = "helloworld/helloworld.png";  
  89.   
  90.         // 获取指定的部署对象中的所有的文件名称  
  91.         Set<String> nameSet = processEngine.getRepositoryService().getResourceNames(deploymentId);  
  92.         System.out.println("所有的文件:");  
  93.         for (String name : nameSet) {  
  94.             System.out.println("\t" + name);  
  95.         }  
  96.   
  97.         // 获取指定的部署对象中的指定名称的文件内容  
  98.         InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, resourceName);  
  99.   
  100.         // 存到d:/中  
  101.         FileOutputStream out = new FileOutputStream("d:/process.png");  
  102.         byte[] buf = new byte[1024];  
  103.         for (int len = -1; (len = in.read(buf)) != -1;) {  
  104.             out.write(buf, 0, len);  
  105.         }  
  106.         in.close();  
  107.         out.close();  
  108.     }  
  109. }  

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 执行流程实例有关的操作 
  3.  *  启动流程实例 
  4.  *  查询我的任务列表 
  5.  *  办理任务 
  6.  *  直接向后执行一步 
  7.  */  
  8. public class ProcessInstanceTest {  
  9.   
  10.     private ProcessEngine processEngine = Configuration.getProcessEngine();  
  11.   
  12.     // 启动流程实例  
  13.     @Test  
  14.     public void testStartProcessInstance() throws Exception {  
  15.         // 使用指定的流程定义启动流程实例(指定名称并且是指定的version)  
  16.         // processEngine.getExecutionService().startProcessInstanceById("helloworld-3");  
  17.   
  18.         // 使用指定key的最新版本的流程定义启动一个流程实例  
  19.         ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("helloworld");  
  20.         System.out.println("流程实例启动成功,processInstanceId=" + pi.getId() + ", processDefinitionId=" + pi.getProcessDefinitionId());  
  21.     }  
  22.   
  23.     // 查询我的(未完成的)任务列表  
  24.     @Test  
  25.     public void testFindMyTaskList() throws Exception {  
  26.         // 准备  
  27.         // String userId = "员工";  
  28.         // String userId = "部门经理";  
  29.         String userId = "总经理";  
  30.   
  31.         // // 查询所有  
  32.         // List<Task> list = processEngine.getTaskService().findPersonalTasks(userId);  
  33.   
  34.         // 分页的查询  
  35.         List<Task> list = processEngine.getTaskService()//  
  36.                 .createTaskQuery()//  
  37.                 // 过滤条件  
  38.                 .assignee(userId)// 指定办理人是谁,如果不指定办理人,就会查出所有人的任务  
  39.                 // 排序条件  
  40.                 // .orderAsc(TaskQuery.PROPERTY_CREATEDATE)  
  41.                 // 执行查询得到结果  
  42.                 // .count();  
  43.                 // .page(firstResult, maxResults)  
  44.                 .list();  
  45.   
  46.         // 显示  
  47.         for (Task t : list) {  
  48.             System.out.println("id=" + t.getId()//  
  49.                     + ", name=" + t.getName()// 任务名称  
  50.                     + ", assignee=" + t.getAssignee()// 办理人  
  51.                     + ", createTime=" + t.getCreateTime()// 此任务的创建时间  
  52.                     + ", executionId=" + t.getExecutionId()); // 所属的执行对象的id  
  53.         }  
  54.     }  
  55.   
  56.     // 办理任务  
  57.     @Test  
  58.     public void testCompleteTask() throws Exception {  
  59.         String taskId = "140001";  
  60.         processEngine.getTaskService().completeTask(taskId);  
  61.     }  
  62.   
  63.     // 直接向后执行一步  
  64.     @Test  
  65.     public void testSignal() throws Exception {  
  66.         String executionId = "helloworld.110001";  
  67.         processEngine.getExecutionService().signalExecutionById(executionId, "to 总经理[审批]");  
  68.     }  

0 0
原创粉丝点击