工作流中的流程追溯!Activiti 框架中历史组件详细解析
Activit 中的历史简介
历史: Activiti 中的一个组件,可以捕获发生在进程执行中的信息并永久的保存.与运行时数据不同的是,当流程实例运行完成之后它还会存在于数据库中
历史实体对象有 5 个:
HistoricProcessInstances: 包含当前和已经结束的流程实例信息
HistoricVariableInstances: 包含最新的流程变量或任务变量
HistoricActivityInstances: 包含一个活动即流程上的节点的执行信息
HistoricTaskInstances: 包含关于当前和已完成或已删除任务实例信息
HistoricDetails: 包含历史流程实例,活动实例,任务实例的各种信息
因为数据库中保存着历史信息以及正在运行的流程实例信息,就要考虑怎样尽量减少的对运行中的流程实例数据进行访问的方式来查询这些表以保证执行的性能
查询历史
在 Activiti API 中提供了 5 中实体的查询方法,在 HistoryService 类中:
createHistoricProcessInstanceQuery()
createHistoricVariableInstanceQuery()
createHistoricActivityInstanceQuery()
createHistoricDetailQuery()
createHistoricTaskInstanceQuery()
HistoricProcessInstanceQuery
流程实例
获取流程定义 ID 是'XXX',已经结束,花费时间最长(持续时间最长)的 10 个 HistoricProcessInstances
HistoricVariableInstanceQuery
在 ID 为'xxx',已经结束的流程实例中查询所有 HistoricVariableInstances, 并按变量名排序
HistoricActivityInstanceQuery
获取所有已经结束的流程定义 ID 为’XXX'并且类型是'serviceTask'中的最后一个 HistoricActivityInstance
HistoricDetailQuery
获取所有 id 为 123 的流程实例中产生的可变更新信息
这个查询只会返回 HistoricVariableUpdates
注意一些变量名可能包含多个 HistoricVariableUpdate 实体,每次流程运行时会更新变量.可以用 orderByTime(变量被更新的时间)或者 orderByVariableRevision(运行更新时变量的版本)来排序查询.
获取所有流程实例 ID 为 123 的流程中 ,提交任务或者启动流程时的 form-properties. 这个查询只会返回 HistoricFormPropertiess
获取所有在执行 ID 为 123 的任务时的变量更新.返回全部在任务中设置的变量 (任务局部变量)HistoricVariableUpdates, 不是流程实例变量
任务局部变量可以用 TaskService 设置,在 TaskListener 里设置
任务局部变量也可以用 DelegateTask 设置,在 TaskListener 里设置
HistoricTaskInstanceQuery
获取所有任务中 10 个花费时间最长(持续时间最长)并已经结束的 HistoricTaskInstances
获取删除原因包含"invalid",最后分配给用户"kermit"的 HistoricTaskInstances
历史配置
历史级别可以用编写代码的方法配置 :org.activiti.engine.impl.history.HistoryLevel (枚举类型)
级别可以在配置文件 activiti.cfg.xml 或者在 spring-context 中配置:
历史信息级别:
none:
忽略所有历史存档:
这是流程执行时性能最好的状态,但没有任何历史信息可用
activity:
保存所有流程实例信息和活动实例信息:
在流程实例结束时,最后一个流程实例中的最新的变量值将赋值给历史变量
不会保存过程中的详细信息
audit:
默认值,保存所有流程实例信息,活动信息,保证所有的变量和提交的表单属性保持同步
这样所有用户交互信息都是可追溯的,可以用来审计
full:
这个级别存储发生在审核以及所有其它细节的信息,主要是更新流程变量
是最高级别的历史信息存档,同样也是最慢的
审计
历史配置在 audit 级别之上,所有通过:
FormService.submitStartFormData(String processDefinitionId, Map<String, String> properties)
FormService.submitTaskFormData(String taskId, Map<String, String> properties)提交的属性都会被记录
表单属性可以通过 API 查询:
类型为 HistoricFormProperty 的详细信息会被查询出来
在调用 IdentityService.setAuthenticatedUserId(String) 提交之前设置了认证用户:
提交表单的用户将被保存在历史信息中:
在开始表单中使用 HistoricProcessInstance.getStartUserId() 获取
在任务表单中用 HistoricActivityInstance.getAssignee() 获取
版权声明: 本文为 InfoQ 作者【攻城狮Chova】的原创文章。
原文链接:【http://xie.infoq.cn/article/8556c03c5be254b81294283a6】。文章转载请联系作者。
评论