写点什么

工作流中的流程追溯!Activiti 框架中历史组件详细解析

发布于: 2021 年 06 月 09 日
工作流中的流程追溯!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:

  • 这个级别存储发生在审核以及所有其它细节的信息,主要是更新流程变量

  • 是最高级别的历史信息存档,同样也是最慢的

审计

  • 历史配置在 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() 获取

发布于: 2021 年 06 月 09 日阅读数: 9
用户头像

一位攻城狮的自我修养 2021.04.06 加入

分享技术干货,面试题和攻城狮故事。 你的关注支持是我持续进步的最大动力! https://github.com/ChovaVea

评论

发布
暂无评论
工作流中的流程追溯!Activiti框架中历史组件详细解析