在流程实例执行的过程中,会不断触发事件。 从那些事件中,运行和完成流程的历史信息会被收集到历史表中。 HistoryService
提供了 对那些信息的访问功能。
如果想查找某一特定流程定义的所有流程实例, 可以像这样操作:
List<HistoryProcessInstance> historyProcessInstances = historyService
.createHistoryProcessInstanceQuery()
.processDefinitionId("ICL-1")
.orderAsc(HistoryProcessInstanceQuery.PROPERTY_STARTTIME)
.list();
单独的活动流程也可以作为HistoryActivityInstance
保存到历史信息中。
List<HistoryActivityInstance> histActInsts = historyService
.createHistoryActivityInstanceQuery()
.processDefinitionId("ICL-1")
.activityName("a")
.list();
也可以使用简易方法avgDurationPerActivity
和 choiceDistribution
。 可以通过javadocs获得这些方法的更多信息。
有时,我们需要获得指定流程实例已经过的节点的完整列表。 下面的查询语句可以用来获得所有已经执行的节点列表:
List<HistoryActivityInstance> histActInsts = historyService
.createHistoryActivityInstanceQuery()
.processInstanceId("ICL.12345")
.list();
上面的查询与通过execution id查询有一些不同。有时execution id和流程实例id是不同的, 当一个节点中使用了定时器,execution id中就会使用额外的后缀, 这就会导致当我们通过execution id查询时, 这个节点不会出现在结果列表中。
列出执行的过程:
// 根据任务开始的时间进行排序,列出来
List<HistoryActivityInstance> haInstance = historyService
.createHistoryActivityInstanceQuery().processInstanceId(instanceId)
.orderAsc(HistoryProcessInstanceQuery.PROPERTY_STARTTIME)
.list();
// 显示每一步骤任务的名称
Iterator<HistoryActivityInstance> it = haInstance.iterator();
while( it.hasNext() ) {
HistoryActivityInstance ha = it.next();
system.out.println( ha.getActivityName() );
}