JBPM学习(3):管理流程实例

来源:互联网 发布:非主流伤感的网络歌曲 编辑:程序博客网 时间:2024/05/18 03:45

流程定义就是对一个过程的完整描述,如果说流程定义是一个模板,那么流程实例就是实际执行的业务(个人觉得有一点点像JAVA中的类和实例),根据流程定义从前往后依次执行。

一节,在上一节管理流程定义的基础上,学习以下几种管理流程实例的方法

  • 启动流程实例
  • 执行等待的流程
  • 查看流程实例
  • 终止流程实例
  • 删除流程实例

这是在第一节定义的流程,本节继续使用该流程进行学习

管理流程实例的所有测试代码如下,下面分别就每一种管理方法进行说明

package com.test;import java.util.List;import org.jbpm.api.Configuration;import org.jbpm.api.ExecutionService;import org.jbpm.api.ProcessEngine;import org.jbpm.api.ProcessInstance;import org.jbpm.api.RepositoryService;import junit.framework.TestCase;public class ProcessInstanceTest extends TestCase {// 流程引擎 ,所有操作都是从它开始的ProcessEngine processEngine;public ProcessInstanceTest() {processEngine = Configuration.getProcessEngine();}protected void setUp() {// 流程资源服务的接口,如流程定义发布、查询、删除等RepositoryService repositoryService = processEngine.getRepositoryService();//发布流程定义repositoryService.createDeployment().addResourceFromClasspath("HelloJbpm.jpdl.xml").deploy();}// 发布流程定义之后,测试流程定义的启动public void testProcessInstance() {// 专门用来控制流程实例ExecutionService executionService = processEngine.getExecutionService();// 通过key找到已发布的流程定义,从而启动该流程定义的流程实例ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");System.out.println(pi); // 打印流程实例查看状态System.out.println(pi.isEnded()); // 判断流程实例是否结束了(没有结束,卡在state处)pi=executionService.signalExecutionById(pi.getId());  //将pi所对应的流程实例继续向下执行System.out.println(pi.isEnded()); // 此时判断流程已结束}public void testProcessInstanceEnd() {ExecutionService executionService = processEngine.getExecutionService();ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");//-------------------此时不想让其继续向下执行----------------------executionService.endProcessInstance(pi.getId(),"cancel");//参数2为强制终结流程的理由}//直接删除流程实例public void testProcessInstanceDelete() {ExecutionService executionService = processEngine.getExecutionService();ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");//级联删除流程实例executionService.deleteProcessInstanceCascade(pi.getId());}//获得流程引擎中所有流程实例的信息public void testProcessInstanceList() {ExecutionService executionService = processEngine.getExecutionService();ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");ProcessInstance pi1 = executionService.startProcessInstanceByKey("HelloJbpm");List<ProcessInstance> list=executionService.createProcessInstanceQuery().list();for(ProcessInstance processInstance:list){System.out.println(processInstance.getId());  //直接打印所有流程定义的信息}}}
1、启动流程实例

如上代码所示,在发布流程定义之后,使用testProcessInstance()方法测试流程实例的启动,该代码片段如下

public void testProcessInstance() {ExecutionService executionService = processEngine.getExecutionService();ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");System.out.println(pi); // 打印流程实例查看状态System.out.println(pi.isEnded()); // 判断流程实例是否结束了(没有结束,卡在state处)}
执行结果:

execution[HelloJbpm.7]表明启动的是HelloJbpm流程定义的一个实例。

false表明实际上该流程实例并没有直接结束。
如流程定义图所示,因为中间使用了一个state活动,所以流程实例会在state活动暂停下来,进入到等待状态。
当一个流程执行到等待状态时,需调用一个方法。执行等待的流程,下面为执行等待流程的方法。

2、执行等待流程

在启动流程实例的基础上,当流程执行到等待状态时,使用signalExecutionById()执行等待流程,让流程实例继续往下执行,代码片段如下:

public void testProcessInstance() {ExecutionService executionService = processEngine.getExecutionService();ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");System.out.println(pi); // 打印流程实例查看状态System.out.println(pi.isEnded()); // 判断流程实例是否结束了(没有结束,卡在state处)pi=executionService.signalExecutionById(pi.getId());  //将pi所对应的流程实例继续向下执行System.out.println(pi.isEnded()); // 此时判断流程已结束}
执行结果:

通过手工调用的方法,继续执行流程实例,至流程结束。

以上两步整体描述为:

首先启动一个流程实例,从开始节点进入state活动,在state活动时进入等待状态,直到手工执行一个
pi=executionService.signalExecutionById(pi.getId())方法流程继续执行,直至end节点,完成整个流程实例。

3、查看流程实例
通过此方法,可以看到所有启动的流程实例信息,代码片段如下:

public void testProcessInstanceList() {ExecutionService executionService = processEngine.getExecutionService();//启动两个流程实例ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");ProcessInstance pi1 = executionService.startProcessInstanceByKey("HelloJbpm");List<ProcessInstance> list=executionService.createProcessInstanceQuery().list();for(ProcessInstance processInstance:list){System.out.println(processInstance.getId());  //直接打印所有流程实例的信息}}
控制台打印出两条已启动的流程实例


4、终止流程实例

如果不想按照流程执行,也可以手工将其强制终或删除,方法如下:

public void testProcessInstanceEnd() {ExecutionService executionService = processEngine.getExecutionService();ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");//-------------------此时不想让其继续向下执行----------------------executionService.endProcessInstance(pi.getId(),"cancel");//参数2为强制终结流程的理由}
5、删除流程实例

终止流程实例的功能类似

public void testProcessInstanceDelete() {ExecutionService executionService = processEngine.getExecutionService();ProcessInstance pi = executionService.startProcessInstanceByKey("HelloJbpm");//级联删除流程实例executionService.deleteProcessInstanceCascade(pi.getId());}
至此,就总结完了管理流程实例的几种方法。

备注:每次启动一个业务实际上都是发起一个新流程业务终止时也就是流程结束时。



原创粉丝点击