流程执行完毕后,究竟去了哪里有些疑问。
虽然已完成的任务在act_ru_task和act_ru_execution表中都已被删除,但是这些数据还存在activiti的数据库中,作为历史改由HistoryService来管理。
历史是一个组件,它可以捕获发生在进程执行中的信息并永久的保存,与运行时数据不同的是,当流程实例运行完成之后它还会存在于数据库中。
Activit默认提供了4中历史级别:
-
none: 不保存任何历史记录,可以提高系统性能;
-
activity:保存所有的流程实例、任务、活动信息;
-
audit:也是Activiti的默认级别,保存所有的流程实例、任务、活动、表单属性;
-
full: 最完整的历史记录,除了包含audit级别的信息之外还能保存详细,例如:流程变量。
对于几种级别根据对功能的要求选择,如果需要日后跟踪详细可以开启full。
在引擎BeanprocessEngineConfiguration中配置:
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <property name="history" value="full">
由于数据库中保存着历史信息以及正在运行的流程实例信息,在实际项目中对已完成任务的查看频率远不及对代办和可接任务的查看,所以在activiti采用分开管理,把正在运行的交给runtimeService管理,而历史数据交给HistoryService来管理。
对已成为历史的数据主要进行查询操作,我们主要关心两种类型的历史数据:
HistoricProcessInstance 包含当前和已经结束的流程实例信息。
HistoricActivityInstance 包含一个活动(流程上的节点)的执行信息 。
1、历史流程实例查看
// 历史流程实例查看(查找按照某个规则一共执行了多少次流程) @Test public void queryHistoricProcessInstance() throws Exception { // 获取历史流程实例的查询对象 HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery(); // 设置查询参数 historicProcessInstanceQuery //过滤条件 .processDefinitionKey("varTest") // 分页条件 // .listPage(firstResult, maxResults) // 排序条件 .orderByProcessInstanceStartTime().desc(); // 执行查询 List<HistoricProcessInstance> hpis = historicProcessInstanceQuery.list(); // 遍历查看结果 for (HistoricProcessInstance hpi : hpis) { System.out.print("pid:" + hpi.getId()+","); System.out.print("pdid:" + hpi.getProcessDefinitionId()+","); System.out.print("startTime:" + hpi.getStartTime()+","); System.out.print("endTime:" + hpi.getEndTime()+","); System.out.print("duration:" + hpi.getDurationInMillis()+","); System.out.println("vars:" + hpi.getProcessVariables()); } }
说明:
1.通常查询历史流程实例都需要指定一个过滤条件,指定 processDefinitionId查看具体某一次部署所开启的流程或者指定 processDefinitionKey查看某个规则下不限版本的所有流程
2.可以选择性添加finished方法控制是否查询未完成的流程实例。在流 程开启时,activiti同时在act_ru_execution表和act_hi_procinst表中 创建了一条记录,在流程完成之前act_hi_procinst表中实例的结束时间 为空
2、历史活动查看
// 历史活动查看(某一次流程的执行经历的多少步) @Test public void queryHistoricActivityInstance() throws Exception { String processInstanceId = "1401"; List<HistoricActivityInstance> hais = historyService.createHistoricActivityInstanceQuery() // 过滤条件 .processInstanceId(processInstanceId ) // 分页条件 // .listPage(firstResult, maxResults) // 排序条件 .orderByHistoricActivityInstanceEndTime().asc() // 执行查询 .list(); for (HistoricActivityInstance hai : hais) { System.out.print("activitiId:" + hai.getActivityId()+","); System.out.print("name:" + hai.getActivityName()+","); System.out.print("type:" + hai.getActivityType()+","); System.out.print("pid:" + hai.getProcessInstanceId()+","); System.out.print("assignee:" + hai.getAssignee()+","); System.out.print("startTime:" + hai.getStartTime()+","); System.out.print("endTime:" + hai.getEndTime()+","); System.out.println("duration:" + hai.getDurationInMillis()); } }
说明:
1.通常查询历史流程活动都需要指定一个过滤条件,指定processInstanceId查看具体某一次流程执行过程中所经历的步奏