工作流中的流程追溯!详细解析Activiti框架中的历史组件
Activit中的历史简介
- 历史: Activiti中的一个组件,可以捕获发生在进程执行中的信息并永久的保存.与运行时数据不同的是,当流程实例运行完成之后它还会存在于数据库中
- 历史实体对象有5个:
- HistoricProcessInstances: 包含当前和已经结束的流程实例信息
- HistoricVariableInstances: 包含最新的流程变量或任务变量
- HistoricActivityInstances: 包含一个活动即流程上的节点的执行信息
- HistoricTaskInstances: 包含关于当前和已完成或已删除任务实例信息
- HistoricDetails: 包含历史流程实例,活动实例,任务实例的各种信息
- 因为数据库中保存着历史信息以及正在运行的流程实例信息,就要考虑怎样尽量减少的对运行中的流程实例数据进行访问的方式来查询这些表以保证执行的性能
查询历史
- 在Activiti API中提供了5中实体的查询方法,在HistoryService类中:
- createHistoricProcessInstanceQuery()
- createHistoricVariableInstanceQuery()
- createHistoricActivityInstanceQuery()
- createHistoricDetailQuery()
- createHistoricTaskInstanceQuery()
HistoricProcessInstanceQuery
- 流程实例
- 获取流程定义ID是'XXX',已经结束,花费时间最长(持续时间最长)的10个HistoricProcessInstances
historyService.createHistoricProcessInstanceQuery()
.finished()
.processDefinitionId("XXX")
.orderByProcessInstanceDuration().desc()
.listPage(0, 10);
HistoricVariableInstanceQuery
- 在ID为'xxx',已经结束的流程实例中查询所有HistoricVariableInstances, 并按变量名排序
historyService.createHistoricVariableInstanceQuery()
.processInstanceId("XXX")
.orderByVariableName.desc()
.list();
HistoricActivityInstanceQuery
- 获取所有已经结束的流程定义ID为’XXX'并且类型是'serviceTask'中的最后一个 HistoricActivityInstance
historyService.createHistoricActivityInstanceQuery()
.activityType("serviceTask")
.processDefinitionId("XXX")
.finished()
.orderByHistoricActivityInstanceEndTime().desc()
.listPage(0, 1);
HistoricDetailQuery
- 获取所有id为123的流程实例中产生的可变更新信息
- 这个查询只会返回HistoricVariableUpdates
- 注意一些变量名可能包含多个HistoricVariableUpdate实体,每次流程运行时会更新变量.可以用orderByTime(变量被更新的时间)或者orderByVariableRevision(运行更新时变量的版本)来排序查询.
historyService.createHistoricDetailQuery()
.variableUpdates()
.processInstanceId("123")
.orderByVariableName().asc()
.list()
- 获取所有流程实例ID为123的流程中 ,提交任务或者启动流程时的form-properties. 这个查询只会返回 HistoricFormPropertiess
historyService.createHistoricDetailQuery()
.formProperties()
.processInstanceId("123")
.orderByVariableName().asc()
.list()
- 获取所有在执行ID为123的任务时的变量更新.返回全部在任务中设置的变量 (任务局部变量)HistoricVariableUpdates, 不是流程实例变量
historyService.createHistoricDetailQuery()
.variableUpdates()
.taskId("123")
.orderByVariableName().asc()
.list()
- 任务局部变量可以用TaskService设置,在TaskListener里设置
taskService.setVariableLocal("123", "myVariable", "Variable value");
- 任务局部变量也可以用DelegateTask设置,在TaskListener里设置
public void notify(DelegateTask delegateTask) {
delegateTask.setVariableLocal("myVariable", "Variable value");
}
HistoricTaskInstanceQuery
- 获取所有任务中10个花费时间最长(持续时间最长)并已经结束的HistoricTaskInstances
historyService.createHistoricTaskInstanceQuery()
.finished()
.orderByHistoricTaskInstanceDuration().desc()
.listPage(0, 10);
- 获取删除原因包含"invalid",最后分配给用户"kermit"的HistoricTaskInstances
historyService.createHistoricTaskInstanceQuery()
.finished()
.taskDeleteReasonLike("%invalid%")
.taskAssignee("kermit")
.listPage(0, 10);
历史配置
- 历史级别可以用编写代码的方法配置 :org.activiti.engine.impl.history.HistoryLevel (枚举类型)
ProcessEngine processEngine = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResourceDefault()
.setHistory(HistoryLevel.AUDIT.getKey())
.buildProcessEngine();
- 级别可以在配置文件activiti.cfg.xml或者在spring-context中配置:
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
<property name="history" value="audit" />
...
</bean>
- 历史信息级别:
- none:
- 忽略所有历史存档:
- 这是流程执行时性能最好的状态,但没有任何历史信息可用
- 忽略所有历史存档:
- activity:
- 保存所有流程实例信息和活动实例信息:
- 在流程实例结束时,最后一个流程实例中的最新的变量值将赋值给历史变量
- 不会保存过程中的详细信息
- 保存所有流程实例信息和活动实例信息:
- audit:
- 默认值,保存所有流程实例信息,活动信息,保证所有的变量和提交的表单属性保持同步
- 这样所有用户交互信息都是可追溯的,可以用来审计
- 默认值,保存所有流程实例信息,活动信息,保证所有的变量和提交的表单属性保持同步
- full:
- 这个级别存储发生在审核以及所有其它细节的信息,主要是更新流程变量
- 是最高级别的历史信息存档,同样也是最慢的
- 这个级别存储发生在审核以及所有其它细节的信息,主要是更新流程变量
- none:
审计
- 历史配置在audit级别之上,所有通过:
- FormService.submitStartFormData(String processDefinitionId, Map<String, String> properties)
- FormService.submitTaskFormData(String taskId, Map<String, String> properties)
提交的属性都会被记录
- 表单属性可以通过API查询:
historyService
.createHistoricDetailQuery()
.formProperties()
...
.list();
类型为HistoricFormProperty的详细信息会被查询出来
- 在调用IdentityService.setAuthenticatedUserId(String) 提交之前设置了认证用户:
- 提交表单的用户将被保存在历史信息中:
- 在开始表单中使用HistoricProcessInstance.getStartUserId() 获取
- 在任务表单中用HistoricActivityInstance.getAssignee() 获取
- 提交表单的用户将被保存在历史信息中: