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