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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 本篇文章详细说明了工作流Activiti框架中的历史组件,这个组件用于捕获发生在进程执行中的信息并对这些信息进行永久保存,在流程实例运行完成后,这些数据依旧保存在数据库中。工作流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() 获取
相关文章
|
13天前
|
前端开发 JavaScript C#
移动应用开发中的跨平台框架解析
【9月更文挑战第5天】在移动应用开发领域,跨平台框架因其“一次编写,处处运行”的便利性而受到开发者的青睐。本文将深入探讨几种流行的跨平台框架,包括React Native、Flutter和Xamarin,并比较它们的优势与局限。我们将通过代码示例揭示这些框架如何简化移动应用的开发过程,同时保持高性能和良好的用户体验。无论你是新手还是有经验的开发者,这篇文章都将成为你了解和选择跨平台框架的宝贵资源。
45 19
|
9天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析
|
19天前
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
57 0
|
19天前
|
Web App开发 IDE 测试技术
自动化测试的利器:Selenium 框架深度解析
【8月更文挑战第31天】在软件开发的世界中,自动化测试是提高产品质量和开发效率不可或缺的一环。本文将深入探讨Selenium这一强大的自动化测试工具,从其架构、优势到实战应用,一步步揭示如何利用Selenium框架提升软件测试的效率和准确性。通过具体的代码示例,我们将展示Selenium如何简化测试流程,帮助开发者快速定位问题,确保软件的稳定性和可靠性。无论你是测试新手还是资深开发者,这篇文章都将为你打开一扇通往高效自动化测试的大门。
|
19天前
|
Java Spring
🔥JSF 与 Spring 强强联手:打造高效、灵活的 Web 应用新标杆!💪 你还不知道吗?
【8月更文挑战第31天】JavaServer Faces(JSF)与 Spring 框架是常用的 Java Web 技术。本文介绍如何整合两者,发挥各自优势,构建高效灵活的 Web 应用。首先通过 `web.xml` 和 `ContextLoaderListener` 配置 Spring 上下文,在 `applicationContext.xml` 定义 Bean。接着使用 `@Autowired` 将 Spring 管理的 Bean 注入到 JSF 管理的 Bean 中。
30 0
|
19天前
|
UED 开发者
哇塞!Uno Platform 数据绑定超全技巧大揭秘!从基础绑定到高级转换,优化性能让你的开发如虎添翼
【8月更文挑战第31天】在开发过程中,数据绑定是连接数据模型与用户界面的关键环节,可实现数据自动更新。Uno Platform 提供了简洁高效的数据绑定方式,使属性变化时 UI 自动同步更新。通过示例展示了基本绑定方法及使用 `Converter` 转换数据的高级技巧,如将年龄转换为格式化字符串。此外,还可利用 `BindingMode.OneTime` 提升性能。掌握这些技巧能显著提高开发效率并优化用户体验。
39 0
|
21天前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
1月前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
53 6
|
5天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
5天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。

热门文章

最新文章

推荐镜像

更多