黄东旭解析 TiDB 的核心优势
754
2023-04-23
如何查询已经执行过的流程信息?
今天我们就来看看 HistoryService 的使用。
本文使用的流程图依然是上篇文章中使用过的,如下:
1. 查询历史流程
查询历史流程的方式很简答,如下:
@SpringBootTestpublic class HiTest { @Autowired HistoryService historyService; private static final Logger logger = LoggerFactory.getLogger(HiTest.class); @Test void test01() { List
由于我们这是 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: 1Flushing dbSqlSessionflush 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 表中关于流程的记录就会被删除掉,也就是执行如下代码现在是查询不到上面这个流程了:
@AutowiredRuntimeService runtimeService;@Testvoid test02() { ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId("a3786614-38eb-11ed-afc8-acde48001122").singleResult(); logger.info("pi:{}",pi);}
这个方法执行返回的 pi 对象现在为 null。
现在我们想查询刚刚执行的流程,得去查询历史流程,也就是去 ACT_HI_PROCINST 表中去查询,执行我们最上面那个方法:
@Testvoid test01() { List
现在去查询,返回的结果中就可以看到 EndActivityId 以及 EndTime 这两个字段了,因为流程已经执行结束了。
通过上面的介绍,大家应该也发现了,在流程执行的过程中,ACT_HI_PROCINST 表中的流程记录和 ACT_RU_EXECUTION 表中的流程记录是一一对应的。
2. 查询历史活动
一个流程中的每一个节点都是一个活动,当一个流程执行结束的时候,如果我们还想查看每一个活动执行的细节,就得通过查询历史活动来实现了。
在查询之前,小伙伴们先来了解下跟历史活动相关的两张表。
ACT_HI_ACTINST
这张表中保存一个流程中的所有活动细节。包括流程的启动节点、结束节点、各种 Task 甚至节点之间的连线,大家来看下这张表中的信息:
大家看到,这刚好是一个流程的完整记录,从上往下,分别是:
启动流程。连线提交请假申请这个 UserTask连线主管审批这个 UserTask连线经理审批这个 UserTask连线结束
事无巨细,全部都记录下来了。
ACT_HI_TASKINST
这个表看名字就知道只记录下来了 Task 的信息,我截个图大家来看下:
小伙伴们看下,这张表记录下来了每一个 Task 的具体信息,包括这个 Task 是由谁处理的,Task 的名字,开始时间、结束时间、耗时等信息。
那么针对这两张表,也有不同的查询方式。
首先来看查询历史活动:
@Testvoid test03() { List
查询结果如下图:
小伙伴们看查询 SQL 也印证我们说的没有问题。由于我这里目前只执行了一个流程,所以这里就只显示了一个流程的所有活动,大家看打印出来的流程 ID 都是一样的。
再来看查询历史 Task:
@Testvoid test04() { List
查询结果如下:
查询 SQL 也如我们所预料的。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。