温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用HistoryService

发布时间:2021-10-12 10:26:25 来源:亿速云 阅读:280 作者:iii 栏目:编程语言

这篇文章主要讲解了“如何使用HistoryService”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用HistoryService”吧!

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() 获取

        • 提交表单的用户将被保存在历史信息中:

      感谢各位的阅读,以上就是“如何使用HistoryService”的内容了,经过本文的学习后,相信大家对如何使用HistoryService这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

      向AI问一下细节

      免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

      AI