共计 3613 个字符,预计需要花费 10 分钟才能阅读完成。
上篇文章和小伙伴们分享的流程操作次要是正在执行的流程,咱们有一个十分常见的场景是查问执行过的流程信息,在上篇文章中,小伙伴们曾经晓得,对于正在执行的流程,会在 ACT_RU_EXECUTION 表中保留一条对应的记录,不过流程执行完结之后,ACT_RU_EXECUTION 表中的记录会被删除掉,此时要是想查问曾经执行过的流程信息,去哪里查问呢?明天咱们就来看看 HistoryService 的应用。
本文应用的流程图仍然是上篇文章中应用过的,如下:
1. 查问历史流程
查问历史流程的形式很简答,如下:
@SpringBootTest
public class HiTest {
@Autowired
HistoryService historyService;
private static final Logger logger = LoggerFactory.getLogger(HiTest.class);
@Test
void test01() {List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().list();
for (HistoricProcessInstance hi : list) {logger.info("==={},{},{},{},{},{}",hi.getId(),hi.getName(),hi.getStartActivityId(),hi.getStartTime(),hi.getEndActivityId(),hi.getEndTime());
}
}
}
因为咱们这是 Spring Boot 我的项目,所以基本上不须要什么额定的配置,间接注入 HistoryService 实例即可。
test01 办法中的代码就是查问进去目前所有的流程实例,包含正在执行的和曾经执行结束的都能够查问到。查问之后,控制台打印后果如下:
==> Preparing: SELECT RES.* , DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_ from ACT_HI_PROCINST RES left outer join ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_ order by RES.ID_ asc
==> Parameters:
<== Total: 1
Flushing dbSqlSession
flush summary: 0 insert, 0 update, 0 delete.
now executing flush...
--- HistoricProcessInstanceQueryImpl finished --------------------------------------------------------
===a3786614-38eb-11ed-afc8-acde48001122,null,startEvent1,Tue Sep 20 21:53:42 CST 2022,null,null
首先大家看到,这里查问的 SQL,查问的表是 ACT_HI_PROCINST,简略截个图大家看下:
大家看到,这张表中记录了流程实例 ID,流程定义 ID,流程开始的工夫,流程完结的工夫,流程执行耗时,流程开始的节点,流程发起人,流程完结的节点等等。
同时大家也能够看到,在打印进去的查问后果中,getEndActivityId 和 getEndTime 这两个字段的值都为 null,这就阐明这个流程目前还在执行中,还没执行结束,当一个流程执行结束的时候,这两个字段就不会为 null 了,小伙伴们能够依据这个特点去判断一个流程是否执行结束。
当初依据咱们上篇文章中介绍的知识点,我将流程这个流程中的工作都执行结束,执行结束之后,ACT_RU_EXECUTION 表中对于流程的记录就会被删除掉,也就是执行如下代码当初是查问不到下面这个流程了:
@Autowired
RuntimeService runtimeService;
@Test
void test02() {ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId("a3786614-38eb-11ed-afc8-acde48001122").singleResult();
logger.info("pi:{}",pi);
}
这个办法执行返回的 pi 对象当初为 null。
当初咱们想查问刚刚执行的流程,得去查问历史流程,也就是去 ACT_HI_PROCINST 表中去查问,执行咱们最下面那个办法:
@Test
void test01() {List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().list();
for (HistoricProcessInstance hi : list) {logger.info("==={},{},{},{},{},{}",hi.getId(),hi.getName(),hi.getStartActivityId(),hi.getStartTime(),hi.getEndActivityId(),hi.getEndTime());
}
}
当初去查问,返回的后果中就能够看到 EndActivityId 以及 EndTime 这两个字段了,因为流程曾经执行完结了。
通过下面的介绍,大家应该也发现了,在流程执行的过程中,ACT_HI_PROCINST 表中的流程记录和 ACT_RU_EXECUTION 表中的流程记录是一一对应的。
2. 查问历史流动
一个流程中的每一个节点都是一个流动,当一个流程执行完结的时候,如果咱们还想查看每一个流动执行的细节,就得通过查问历史流动来实现了。
在查问之前,小伙伴们先来理解下跟历史流动相干的两张表。
ACT_HI_ACTINST
这张表中保留一个流程中的所有流动细节。包含流程的启动节点、完结节点、各种 Task 甚至节点之间的连线,大家来看下这张表中的信息:
大家看到,这刚好是一个流程的残缺记录,从上往下,别离是:
- 启动流程。
- 连线
- 提交销假申请这个 UserTask
- 连线
- 主管审批这个 UserTask
- 连线
- 经理审批这个 UserTask
- 连线
- 完结
事无巨细,全副都记录下来了。
ACT_HI_TASKINST
这个表看名字就晓得只记录下来了 Task 的信息,我截个图大家来看下:
小伙伴们看下,这张表记录下来了每一个 Task 的具体信息,包含这个 Task 是由谁解决的,Task 的名字,开始工夫、完结工夫、耗时等信息。
那么针对这两张表,也有不同的查问形式。
首先来看查问历史流动:
@Test
void test03() {List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery().orderByHistoricActivityInstanceStartTime().asc().list();
for (HistoricActivityInstance hai : list) {logger.info("流程 ID:{},流动名称:{},流动 ID:{},流动解决人:{}",hai.getProcessInstanceId(),hai.getActivityName(),hai.getActivityId(),hai.getAssignee());
}
}
查问后果如下图:
小伙伴们看查问 SQL 也印证咱们说的没有问题。因为我这里目前只执行了一个流程,所以这里就只显示了一个流程的所有流动,大家看打印进去的流程 ID 都是一样的。
再来看查问历史 Task:
@Test
void test04() {List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().orderByHistoricTaskInstanceStartTime().asc().list();
for (HistoricTaskInstance hti : list) {logger.info("流程 ID:{},Task 开始工夫:{},Task 完结工夫:{},Task 解决人:{}",hti.getProcessInstanceId(),hti.getCreateTime(),hti.getEndTime(),hti.getAssignee());
}
}
查问后果如下:
查问 SQL 也如咱们所意料的。