Activiti5入门--流程实例开始结束

本章学习流程实例的开始和结束节点,通过学习该内容,了解如何判断流程是否结束。

为了了解如何判断流程是否结束,我们新建包cn.demo.start,创建新类StartTest,并新建start.bpmn流程图文件定义新的流程。

此次,流程比较简单,只有两个节点:开始节点和结束节点

  1. 创建开始节点
  2. 创建结束节点
  3. 使用连线连接开始和结束节点,并设置其Name的值为开始活动
  4. 点击空白处,设置Id的值为start,Name的值为startProcess

开始和结束

接下来,我们就来部署流程定义以及启动流程实例

部署流程定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 部署流程定义
*/
@Test
public void deploymentProcessDefinition() {
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("start.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("start.png");
Deployment deploy = processEngine.getRepositoryService() // 与流程定义和部署对象相关的Service
.createDeployment() // 创建一个部署对象
.name("开始活动") // 添加部署的名称
.addInputStream("start.bpmn", inputStreamBpmn)
.addInputStream("start.png",inputStreamPng)
.deploy(); // 完成部署
System.out.println("部署ID: " + deploy.getId());
System.out.println("部署名称: " + deploy.getName());
}

执行代码,部署流程定义成功,得到如下结果

部署ID: 4701
部署名称: 开始活动

启动流程实例

可以预见,因为该流程只有开始和结束节点,一旦启动流程实例,很快地,流程就会结束。

若我们需要判断流程实例是否结束,可以通过runtimeService查询流程实例对象,如果对象为null,则表示流程已经结束。

若我们想要获取流程实例的信息,则需要从历史表中查询。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* 启动流程实例
*/
@Test
public void startProcessInstance() {
// 流程定义的key
String processDefinitionKey = "start";
ProcessInstance processInstance = processEngine.getRuntimeService()
.startProcessInstanceByKey(processDefinitionKey);
System.out.println("流程实例ID: " + processInstance.getId());
System.out.println("流程定义ID: " + processInstance.getProcessDefinitionId());
// 判断流程是否结束
ProcessInstance pi = processEngine.getRuntimeService()
.createProcessInstanceQuery()
.processInstanceId(processInstance.getId()).singleResult();
// 说明流程实例结束
if(pi==null) {
/*查询历史,获取流程实例相关信息*/
HistoricProcessInstance historicProcessInstance = processEngine.getHistoryService().createHistoricProcessInstanceQuery()
// 使用流程实例Id查询
.processInstanceId(processInstance.getId())
.singleResult();
System.out.println(historicProcessInstance.getId()+ " "
+historicProcessInstance.getStartTime()+" "
+historicProcessInstance.getEndTime()+" "
+historicProcessInstance.getDurationInMillis());
}
}

若启动流程实例成功,输出如下结果

流程实例ID: 4801
流程定义ID: start:1:4704
4801 Mon Oct 15 23:33:37 CST 2018 Mon Oct 15 23:33:37 CST 2018 55

总结

现在,我们可以总结一下了

  1. 结束节点没有出口
  2. 其他节点有一个或多个出口:
    • 如果有一个出口,则代表是一个单线流程
    • 如果有多个出口,则代表是开启并发流程
  3. 可以通过runTimeService查询流程实例对象,若流程实例对象为空,则表示该流程实例已经结束