一.简介
正在执行的流程信息是保存在以 ACT_RU_ 为前缀的表中,执行完毕的流程信息则保存在以 ACT_HI_ 为前缀的表中,也就是流程历史信息表。
假设有一个流程,流程图如下:
当这个流程执行完毕后,以 ACT_RU_ 为前缀的表中的数据均已清空,现在如果想查看刚刚执行过的流程信息,就得去以 ACT_HI_ 为前缀的表中。
下面看下各种历史信息如何查询。
二.历史权限查询
这个是用来查询流程或者任务的处理人,例如查询流程的处理人,查询代码如下:
@Test
void test11() {
HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().singleResult();
List<HistoricIdentityLink> links = historyService.getHistoricIdentityLinksForProcessInstance(pi.getId());
for (HistoricIdentityLink link : links) {
logger.info("userId:{}",link.getUserId());
}
}
这个是查询流程对应的处理人,对应的 SQL语句如下:
select * from ACT_HI_IDENTITYLINK where PROC_INST_ID_ = ?
如果想查询任务的处理人,代码如下:
@Test
void test12() {
String taskName = "提交请假申请";
HistoricTaskInstance hti = historyService.createHistoricTaskInstanceQuery().taskName(taskName).singleResult();
List<HistoricIdentityLink> links = historyService.getHistoricIdentityLinksForTask(hti.getId());
for (HistoricIdentityLink link : links) {
logger.info("{} 任务的处理人是 {}",taskName,link.getUserId());
}
}
这个查询对应的 SQL语句如下:
select * from ACT_HI_IDENTITYLINK where TASK_ID_ = ?
和前面的相比,其实就多了一个查询条件 TASK_ID_。
三.自定义查询 SQL
和前面讲的很多查询类似,当弄懂了每一个历史查询的 API 操作的是哪一个数据表,就会发现,历史数据的查询,也可以自定义 SQL。
举个例子:
例如查询某一个流程已经执行完毕的历史任务,代码如下:
@Test
void test13() {
List<HistoricProcessInstance> instanceList = historyService.createHistoricProcessInstanceQuery().list();
for (HistoricProcessInstance hpi : instanceList) {
List<HistoricTaskInstance> list = historyService.createNativeHistoricTaskInstanceQuery()
.sql("SELECT RES.* from ACT_HI_TASKINST RES WHERE RES.PROC_INST_ID_ = #{pid} and RES.END_TIME_ is not null order by RES.ID_ asc")
.parameter("pid",hpi.getId()).list();
for (HistoricTaskInstance hti : list) {
logger.info("name:{},assignee:{},createTime:{},endTime:{}", hti.getName(), hti.getAssignee(), hti.getCreateTime(), hti.getEndTime());
}
}
}
flowable 底层是 MyBatis,所有 SQL 中参数的传递形式和 MyBatis 一致。
四.历史数据记录级别
Flowable 需要记录哪些历史数据,有一个日志级别用来描述这个事情,默认有四种级别:
- None: 这个表示不存储任何历史信息,好处是流程执行的时候效率会比较快,坏处是流程执行结束后,看不到曾经执行过的流程信息了。
- Activity: 这个会存储所有流程实例和活动实例,在流程实例结束时,顶级流程实例变量的最新值将复制到历史变量实例中,不会存储详细信息。
- Audit: 在 Activity 的基础上,还会存储历史详细信息,包括权限信息等。默认的日志记录级别即次。
- Full: 这个是在 Audit 的基础上,还会存储变量的变化信息,这会记录大量的数据,也会导致流程执行变慢。
一共就这四种级别,在 Spring Boot 项目中,如果我们想要配置这个日志记录的级别,直接在 application.properties 中进行配置即可,配制如下:
flowable.history-level=none
配置加了这个配置,我们随便启动一个流程,然后去查询 ACT_HI_ 系列的表,发现都是空的,没有数据。
如果我们将历史日志记录的级别改为 activity,那么就会记录下来流程信息以及活动信息,但是像执行的 Task 这些信息都是没有的**(ACT_HI_TASKINST),包括流程参与者的信息(ACT_HI_IDENTITYLINK)**等都不会记录下来。
如果我们将历史日志记录的级别改为 audit,则上面提到的这几种日志就都会记录下来。但是 ACT_HI_DETAIL 表还是空的,详细一个流程变量的变化过程不会被记录下来。
如果我们将日志记录级别改为 full,那么将会记录下更多的信息。ACT_HI_DETAIL 表中会记录下流程变量的详细信息。