Activiti5入门--流程历史数据查询

学完上一章关于“流程变量”知识的介绍,这一章我们学习查询流程历史数据。查询流程历史数据比较简单。下面我们就来完成四类历史数据的查询。

在学习查询流程历史数据之前,先创建一个包cn.demo.historyquery,再新建一个类HistoryQueryTest用于示例代码的编写。

无论查询什么历史数据,使用的都是historyService及其对应的方法,下面都是按照历史流程实例Id来查的。

查询历史流程实例

就是查询按照某个流程定义的规则一共执行了多少次流程,下面根据特定流程实例Id查询单个流程实例

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 查询历史流程实例
*/
public void findHistoryProcessInstance() {
String processInstanceId ="2101";
HistoricProcessInstance hpi = processEngine.getHistoryService().createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId)
.orderByProcessInstanceStartTime().asc()
.singleResult();
System.out.println(hpi.getId()+" "+hpi.getProcessDefinitionId()+" "+hpi.getStartTime()+" "+hpi.getEndTime());
}

执行以上代码,结果如下

2101 processVariables:2:2004 Thu Sep 27 20:12:21 CST 2018 Thu Sep 27 21:48:47 CST 2018

查询历史活动

查询某一次流程的执行一共经历了多少个活动,即走完一次流程所需的所有节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* 查询历史活动
*/
@Test
public void findHistoryActiviti() {
String processInstanceId ="2101";
List<HistoricActivityInstance> list = processEngine.getHistoryService().createHistoricActivityInstanceQuery()
.processInstanceId(processInstanceId)
.orderByHistoricActivityInstanceStartTime().asc()
.list();
if(list!=null && list.size()>0) {
for(HistoricActivityInstance hai:list) {
System.out.println(hai.getId()+" "+hai.getProcessInstanceId()+" "
+hai.getActivityType()+" "
+hai.getStartTime()+" "
+hai.getEndTime()+" "
+hai.getDurationInMillis()
);
System.out.println();
}
}
}

运行代码,有如下结果

2102 2101 startEvent Thu Sep 27 20:12:21 CST 2018 Thu Sep 27 20:12:21 CST 2018 38

2103 2101 userTask Thu Sep 27 20:12:21 CST 2018 Thu Sep 27 21:45:27 CST 2018 5586685

2401 2101 userTask Thu Sep 27 21:45:27 CST 2018 Thu Sep 27 21:48:46 CST 2018 199660

2501 2101 endEvent Thu Sep 27 21:48:47 CST 2018 Thu Sep 27 21:48:47 CST 2018 1

查询历史任务

某一次流程的执行一共经历了多少个任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 查询历史任务
*/
@Test
public void findHistoryTask() {
String processInstanceId = "2101";
List<HistoricTaskInstance> list = processEngine.getHistoryService().
createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
.orderByHistoricTaskInstanceStartTime().asc().list();
if (list != null && list.size() > 0) {
for (HistoricTaskInstance hti : list) {
System.out.println(hti.getId() + " " + hti.getName() + " " + hti.getProcessInstanceId() + " "
+ hti.getStartTime() + " " + hti.getEndTime());
System.out.println();
}
}
}

运行代码,得到如下结果

2104 提交申请 2101 Thu Sep 27 20:12:21 CST 2018 Thu Sep 27 21:45:27 CST 2018

2402 经理审批 2101 Thu Sep 27 21:45:27 CST 2018 Thu Sep 27 21:48:46 CST 2018

查询历史流程变量表

查询某一次流程的执行设置的所有流程变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 查询流程变量历史表
*/
@Test
public void findHistoryProcessVariables() {
String processInstanceId = "2101";
List<HistoricVariableInstance> list = processEngine.getHistoryService()
.createHistoricVariableInstanceQuery()
.processInstanceId(processInstanceId)
.list();
if(list!=null && list.size()>0) {
for(HistoricVariableInstance hvi:list) {
System.out.println(hvi.getId()+","
+hvi.getProcessInstanceId()
+","+hvi.getVariableName()
+","+hvi.getVariableTypeName()
+","+hvi.getValue());
System.out.println();
}
}
}

运行代码,得到如下结果

2202,2101,人员信息,serializable,cn.demo.processvariables.Person@65c7a252

2302,2101,人员信息(添加固定版本),serializable,cn.demo.processvariables.Person@4d154ccd

总结

由于数据库中保存着历史信息以及正在运行的流程实例信息,在实际项目中对已完成任务的查看频率远不及对待办和可接任务的查看,所以在activiti采用分开管理,把正在运行的交给runtimeServicetaskService管理,而历史数据交给historyService来管理。

这样做的好处在于,加快流程执行的速度,因为正在执行的流程的表中数据不会很大。