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

工作流中的流程追溯!详细解析Activiti框架中的历史组件的更多相关文章

  1. Spring5源码解析-Spring框架中的单例和原型bean

    Spring5源码解析-Spring框架中的单例和原型bean 最近一直有问我单例和原型bean的一些原理性问题,这里就开一篇来说说的 通过Spring中的依赖注入极大方便了我们的开发.在xml通过& ...

  2. 在ASP.NET MVC 框架中调用 html文件及解析get请求中的参数值

    在ASP.NET MVC 框架中调用 html文件: public ActionResult Index() { using (StreamReader sr = new StreamReader(P ...

  3. ***PHP中error_reporting()用法详解(含codeigniter框架中屏蔽错误提示的解决方案)

    php中我们对错误的处理会常用到error_reporting函数了,大家可以看到最多的是error_reporting(E_ALL ^ E_NOTICE)了,这个到底什么意思呢,下面我来来看看. e ...

  4. 工作流中的数据持久化详解!Activiti框架中JPA的使用分析

    Activiti中JPA简介 可以使用JPA实体作为流程变量, 并进行操作: 基于流程变量更新已有的JPA实体,可以在用户任务的表单中填写或者由服务任务生成 重用已有的领域模型,不需要编写显示的服务获 ...

  5. 工作流Activiti框架中的LDAP组件使用详解!实现对工作流目录信息的分布式访问及访问控制

    Activiti集成LDAP简介 企业在LDAP系统中保存了用户和群组信息,Activiti提供了一种解决方案,通过简单的配置就可以让activit连接LDAP 用法 要想在项目中集成LDAP,需要在 ...

  6. Thrift 2中get用法的详细解析

    Thrift2相比于Thrift 1改动较大,这里不去描述改动的地方,但是它的改动确实比Thrift1方便了很多.但是不能理解的是Thrift2网上的资料和文档相当的少,就以Thrift2操作Hbas ...

  7. Redis 中 redis.conf配置详细解析

    ########################################### 基本配置 ##################################### # 端口 port 666 ...

  8. JDK中线程池参详细解析

    在jdk中为我们提供了三种创建线程池的方式,但是在阿里的编码规范里面都是明确禁止使用这三种api去创建线程池,推荐我们去自定义线程池.为什么? 要回答为什么,我们需要明白创建线程池时,各参数的作用: ...

  9. 详细解析ASP.NET中Request接收参数乱码原理

    起因:今天早上被同事问了一个问题:说接收到的参数是乱码,让我帮着解决一下. 实际情景: 同事负责的平台是Ext.js框架搭建的,web.config配置文件里配置了全局为“GB2312”编码: < ...

随机推荐

  1. 一文解决MySQL时区相关问题

    前言: 在使用MySQL的过程中,你可能会遇到时区相关问题,比如说时间显示错误.时区不是东八区.程序取得的时间和数据库存储的时间不一致等等问题.其实,这些问题都与数据库时区设置有关,本篇文章将从数据库 ...

  2. C++ primer plus读书笔记——第8章 函数探幽

    第8章 函数探幽 1. 对于内联函数,编译器将使用相应的函数代码替换函数调用,程序无需跳到一个位置执行代码,再调回来.因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存. 2. 要使用内 ...

  3. 测试报告$\beta$

    VisualPytorch beta发布了! 功能概述:通过可视化拖拽网络层方式搭建模型,可选择不同数据集.损失函数.优化器生成可运行pytorch代码 扩展功能:1. 模型搭建支持模块的嵌套:2. ...

  4. OO_Unit4_UML模型化设计

    CSDN博客传送门 @ 目录 一.架构设计 (一)第一次作业 作业需求分析 建立类图 bug修复 (二)第二次作业 作业需求分析 建立类图 checkForUml002实现方式 checkForUml ...

  5. .Net Core——用代码写代码?

    想要用代码写代码,肯定是绕不开反射的.反射的概念相比都不陌生,只是应用多少就因人而异,今天分享一个代码生成器的思路,仅供参考,不要过分依赖哦. 思路分析 众所周知,利用反射可以在程序运行时获取到任一对 ...

  6. centos7 启动引导顺序

    查看默认启动项 grub2-editenv list 查看启动项列表 awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg 设 ...

  7. tail -fn 1000 test.log | grep '关键字' 按照时间段 sed -n '/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p' test.log /var/log/wtmp 该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件

    Linux 6种日志查看方法,不会看日志会被鄙视的 2020-02-11阅读 7.3K0   作为一名后端程序员,和Linux打交道的地方很多,不会看Linux日志,非常容易受到来自同事和面试官的嘲讽 ...

  8. sosreport -a --report

    sosreport -a --report 时间:2019-09-28 本文章向大家介绍sosreport -a --report,主要包括sosreport -a --report使用实例.应用技巧 ...

  9. linux 服务开机自启动systemd方式 (Centos7)

    linux 服务开机自启动systemd方式 (Centos7) 1.编写一个 /opt/hello.sh 脚本 [root@jws-ftp prometheus]# cat /opt/hello.s ...

  10. 按时按登录IP记录Linux所有用户操作日志的方法

    背景:Linux用户操作记录一般通过命令history来查看历史记录,但是如果因为某人误操作了删除了重要的数据,这种情况下history命令就不会有什么作用了.以下方法可以实现通过记录登陆IP地址和所 ...