在上一节中说明了流程定义的部署,按照family168临远的话来说:如果说流程定义是一个模板,讲一套操作都定义成一个环节一个环节的结构,那流程实例就是我们所执行的实际业务,就像模板规定的一样从前往后依次执行。
首先,在上一篇文章所创建的工程之上,新建一个JUnit文件,取名为ProcessInatanceTest.java。创建完毕之后,项目的文件结构如下图3-1所示:
图3-1 创建ProcessInstanceTest.java
1、文件主体代码:
package com.chuang;
import junit.framework.TestCase;
import org.jbpm.api.*;
import java.util.*;
public class ProcessInstanceTest extends TestCase {
//定义流程引擎
ProcessEngine processEngine;
//构造函数
public ProcessInstanceTest()
{
//构造流程实例
processEngine = Configuration.getProcessEngine();
}
protected void setUp()
{
//首先发布流程定义
processEngine.getRepositoryService().createDeployment().
addResourceFromClasspath("jbpmHellowWorld.jpdl.xml").deploy();
}
public void testProcessInstance()
{
//获得ExecutionService以控制流程实例
ExecutionService executionService = processEngine.getExecutionService();
//启动流程实例,通过关键字值启动,关键字即我们定义的jbpmHellowWord.jpdl.xml的名
ProcessInstance pi = executionService.startProcessInstanceByKey("jbpmHellowWorld");
//查看流程实例状态
System.out.println(pi);
//查看流程实例是否完成,若未完成则返回false
System.out.println(pi.isEnded());
//由于我们之前的流程定义有一个state状态等待节点,故而此时流程实例停留在state处并没有结束
//通过signal方法继续执行流程实例
pi = executionService.signalExecutionById(pi.getId());
System.out.println(pi.isEnded());
}
//强制结束流程实例
public void testProcessInstanceEnd()
{
//获得ExecutionService以控制流程实例
ExecutionService executionService = processEngine.getExecutionService();
//启动流程实例,通过关键字值启动,关键字即我们定义的jbpmHellowWord.jpdl.xml的名
ProcessInstance pi = executionService.startProcessInstanceByKey("jbpmHellowWorld");
//强制结束流程实例
executionService.endProcessInstance(pi.getId(), "cancel");
}
//级联删除流程实例
public void testProcessInstanceDelete()
{
//获得ExecutionService以控制流程实例
ExecutionService executionService = processEngine.getExecutionService();
//启动流程实例,通过关键字值启动,关键字即我们定义的jbpmHellowWord.jpdl.xml的名
ProcessInstance pi = executionService.startProcessInstanceByKey("jbpmHellowWorld");
//级联删除流程实例
executionService.deleteProcessInstanceCascade(pi.getId());
}
//输出当前流程实例List信息
public void testProcessInstanceList()
{
//获得ExecutionService以控制流程实例
ExecutionService executionService = processEngine.getExecutionService();
//启动流程实例,通过关键字值启动,关键字即我们定义的jbpmHellowWord.jpdl.xml的名
ProcessInstance pi = executionService.startProcessInstanceByKey("jbpmHellowWorld");
ProcessInstance pi2 = executionService.startProcessInstanceByKey("jbpmHellowWorld");
List<ProcessInstance> list=executionService.createProcessInstanceQuery().list();
for(ProcessInstance processInstance :list)
{
//输出流程实例信息
System.out.println(processInstance.getId());
}
}
}
2、代码详解--发起新流程
在流程定义部署到jbpm数据库以后,我们就可以调用jbpm封装好的函数进行发起相应流程定义的流程实例。发起一个流程实例主要用到以下几句代码(以上面的代码为例):
//获得ExecutionService以控制流程实例
ExecutionService executionService = processEngine.getExecutionService();
//启动流程实例,通过关键字值启动,关键字即我们定义的jbpmHellowWord.jpdl.xml的名
ProcessInstance pi = executionService.startProcessInstanceByKey("jbpmHellowWorld");
即流程实例的发起主要是通过:
1)processEngine.getExecutionService()(流程引擎实例的getExecutionService()方法获得流程执行服务实例)。
2)executionService.startProcessInstanceByKey("jbpmHellowWorld");即通过ExecutionService对象的startProcessInstanceByKey()来发起流程实例。
3、代码详解--唤醒等待流程
pi = executionService.signalExecutionById(pi.getId());
注释中解释的很清楚,我们就是通过ExecutionService对象的signalExecutionById()方法来唤醒新流程。
4、代码详解--强制结束流程
executionService.endProcessInstance(pi.getId(), "cancel");
参数1:流程实例Id,参数2:结束流程的原因。
5、代码详解--删除流程
executionService.deleteProcessInstanceCascade(pi.getId());
此处使用的方法是级联删除流程实例。
6、程序输出(此处只列出重点输出结果):
JUnit 1:testProcessInstance()的输出如下:
jbpmHellowWorld.9
false
true
JUnit 4:testProcessInstanceList()的输出结果如下
jbpmHellowWorld.7
jbpmHellowWorld.9
7、总结语
我个人认为流程定义和流程实例之间的关系就和C++中的类定义和类对象之间的关系一样。
JUnit 4:testProcessInstanceList()更使我们了解了二者之间的关系。
对于流程实例的执行和删除我还存在的疑问(再次声明本人初学者):
首先流程实例也是要存储在jbpm数据库中的那么,当我们发起一个流程实例时我们也就在jbpm数据库的某些表中做了更改(增加了相应流程实例的条目),那么:
1)删除流程实例后数据库中是否不再存有乡音运行过的流程实例信息?
2)流程实例成功执行后,数据库中是否还保留相应流程实例的信息?
3)流程实例执行到一半,我们不再处理相应的流程实例业务,那么当我们断开连接后再次登录,是否还能继续执行相应流程实例?
本人初学者,学习中!come on!