流程定义就是对一个过程的完整描述,如果说流程定义是一个模板,那么流程实例就是实际执行的业务(个人觉得有一点点像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()); }至此,就总结完了管理流程实例的几种方法。
备注:每次启动一个业务实际上都是发起一个新流程,业务终止时也就是流程结束时。