当前位置: 首页 > 后端技术 > Java

如何查询已经执行的进程信息?

时间:2023-04-01 13:50:37 Java

上篇分享给小伙伴的进程操作,主要是正在执行的进程。我们有一个很常见的场景,就是查询已执行进程的信息。在上一篇文章中,小伙伴们已经知道,对于被执行的进程,会在ACT_RU_EXECUTION表中保存一条对应的记录,但是在进程执行完毕后,ACT_RU_EXECUTION表中的记录会被删除。如果要查询已执行进程的信息,到哪里查询呢?今天我们就来看看HistoryService的使用。本文使用的流程图还是上一篇使用的流程图,如下:1.查询历史流程查询历史流程的方式很简单,如下:@SpringBootTestpublicclassHiTest{@AutowiredHistoryServicehistoryService;privatestaticfinalLoggerlogger=LoggerFactory.getLogger(HiTest.class);@Testvoidtest01(){Listlist=historyService.createHistoricProcessInstanceQuery().list();for(HistoricProcessInstancehi:list){logger.info("==={},{},{},{},{},{}",hi.getId(),hi.getName(),hi.getStartActivityId(),hi.getStartTime(),hi.getEndActivityId(),hi.getEndTime());}}}由于这是一个SpringBoot项目,所以基本上不需要额外的配置,直接注入HistoryService实例即可。test01方法中的代码是查询当前所有的流程实例,包括正在执行的和已经执行的。查询后控制台打印如下结果:==>Preparing:SELECTRES.*,DEF.KEY_asPROC_DEF_KEY_,DEF.NAME_asPROC_DEF_NAME_,DEF.VERSION_asPROC_DEF_VERSION_,DEF.DEPLOYMENT_ID_asDEPLOYMENT_ID_fromACT_HI_PROCINSTDEFREF_RESjoCDonRES.PROC_DEF_ID_=DEF.ID_orderbyRES.ID_asc==>Parameters:<==Total:1FlushingdbSqlSessionflushsummary:0insert,0update,0delete.nowexecutioningflush...---HistoricProcessInstanceQueryImpl完成-------------------------------------------------------===a3786614-38eb-11ed-afc8-acde48001122,null,startEvent1,TueSep2021:53:42CST2022,null,null首先可以看到这里查询的SQL,查询到的表是ACT_HI_PROCINST,简单截图一下,可以看到,这张表记录了流程实例ID,流程定义ID,流程开始时间,流程结束时间,流程执行时间,流程开始节点,流程发起者、进程端节点等。同时还可以看到,在打印出来的查询结果中,getEndActivityId和getEndTime这两个字段的值都是null,说明这个流程还在执行中,还没有执行完。当一个流程执行完的时候,这两个字段不会为null,小伙伴们可以根据这个特性来判断一个流程是否已经执行完毕。现在,根据我们上一篇文章介绍的知识点,我已经执行了流程中的所有任务。执行后,ACT_RU_EXECUTION表中关于进程的记录会被删除,即下面代码的执行现在是查询。对于上面的流程:@AutowiredRuntimeServiceruntimeService;@Testvoidtest02(){ProcessInstancepi=runtimeService.createProcessInstanceQuery().processInstanceId("a3786614-38eb-11ed-afc8-acde48001122").singleResult();logger.info("pi:{}",pi);}此方法执行返回的pi对象现在为null。现在我们要查询刚刚执行的流程,就要查询历史流程,也就是在ACT_HI_PROCINST表中查询,执行我们的top方法:@Testvoidtest01(){Listlist=historyService.createHistoricProcessInstanceQuery()。列表();for(HistoricProcessInstancehi:list){logger.info("==={},{},{},{},{},{}",hi.getId(),hi.getName(),hi.getStartActivityId(),hi.getStartTime(),hi.getEndActivityId(),hi.getEndTime());}}现在去查询,可以看到返回结果中有EndActivityId和EndTime这两个字段,因为流程Execution结束了。通过上面的介绍大家应该也发现,在流程执行过程中,ACT_HI_PROCINST表中的流程记录和ACT_RU_EXECUTION表中的流程记录是一一对应的。2.查询历史活动。流程中的每个节点都是一个活动。当一个流程执行时,如果我们想查看每个活动执行的详细信息,我们就不得不查询历史活动。在查询之前,我们先了解一下历史活动相关的两张表。ACT_HI_ACTINST此表包含流程中的所有活动详细信息。包括流程的起始节点,结束节点,各种任务甚至节点之间的联系,我们来看看这张表的信息:可以看到,这只是一个流程的完整记录,从上到下底部分别是:启动进程。在线提交请假申请。UserTask连接管理器批准UserTask连接管理器批准UserTask连接。UserTask连接的结束是详细的,一切都被记录下来。ACT_HI_TASKINST表的名称表明只记录了Task的信息。截图给大家看一下:朋友们,这张表记录了每个Task的具体信息,包括谁来处理这个Task。有,Task的名称,开始时间,结束时间,耗时等信息。那么这两个表就有了不同的查询方式。先看查询历史活动:@Testvoidtest03(){Listlist=historyService.createHistoricActivityInstanceQuery().orderByHistoricActivityInstanceStartTime().asc().list();for(HistoricActivityInstancehai:list){logger.info("进程ID:{},活动名称:{},活动ID:{},活动处理程序:{}",hai.getProcessInstanceId(),hai.getActivityName(),hai.getActivityId(),hai.getAssignee());}}查询结果如下图:看查询SQL的朋友也确认我们说的没有问题。由于我这里只执行一个进程,所以这里只显示一个进程的所有活动。可以看到打印出来的进程ID是一样的。再看查询历史Task:@Testvoidtest04(){Listlist=historyService.createHistoricTaskInstanceQuery().orderByHistoricTaskInstanceStartTime().asc().list();for(HistoricTaskInstancehti:list){logger.info("进程ID:{},任务开始时间:{},任务结束时间:{},任务处理程序:{}",hti.getProcessInstanceId(),hti.getCreateTime(),hti.getEndTime(),hti.getAssignee());}}查询结果如下:查询SQL也如我们所料。