Flowable历史查询实例分析

 更新时间:2023年10月01日 09:39:05   作者:吴声子夜歌  
这篇文章主要介绍了Flowable历史查询实例分析,历史是记录流程执行过程中发生的事情,并将其永久存储的组件,与运行时数据不同,历史数据在流程实例完成以后仍保存在数据库中,下面我们来深入了解

介绍

历史是记录流程执行过程中发生的事情,并将其永久存储的组件。与运行时数据不同,历史数据在流程实例完成以后仍保存在数据库中。

有6个历史实体:

  • HistoricProcessInstance保存当前及已结束流程实例的信息。
  • HistoricVariableInstance保存流程变量或任务变量的最新值。
  • HistoricActivityInstance保存活动(流程中的节点)的一次执行的信息。
  • HistoricTaskInstance保存当前与历史(完成及删除的)任务实例的信息。
  • HistoricIdentityLink保存任务及流程实例、当前及历史的身份关联的信息。
  • HistoricDetail保存与历史流程实例、活动实例或任务实例等有关的多种信息。

历史与当前进行中的流程实例都在数据库中保存历史实体,因此可以选择直接查询历史表,以减少对运行时流程实例数据的访问,并提高运行时执行的性能。

历史流程实例查询

获取所有流程中,完成所花费时间(持续时间)排名前10的、流程定义为XXX的、已完成的HistoricProcessInstances(历史流程实例)。

historyService.createHistoricProcessInstanceQuery()
  .finished()
  .processDefinitionId("XXX")
  .orderByProcessInstanceDuration().desc()
  .listPage(0, 10);
@Test
public void QueryHistoryProcess() {
	// 获取流程引擎对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    HistoryService historyService = processEngine.getHistoryService();
    HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
    		.processInstanceId("2c495021-55bf-11ed-a800-005056c00001")
            .orderByProcessInstanceStartTime().asc()
            .singleResult();
    System.out.println("流程实例ID:" + historicProcessInstance.getId());
    System.out.println("流程定义ID:" + historicProcessInstance.getProcessDefinitionId());
    System.out.println("流程开始时间:" + historicProcessInstance.getStartTime());
    System.out.println("流程结束时间:" + historicProcessInstance.getEndTime());
}

==>  Preparing: select distinct 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_ WHERE RES.PROC_INST_ID_ = ? order by RES.START_TIME_ asc 
==> Parameters: 2c495021-55bf-11ed-a800-005056c00001(String)
<==      Total: 1

流程实例ID:2c495021-55bf-11ed-a800-005056c00001
流程定义ID:MyLeave:1:8c16935c-5544-11ed-b9df-005056c00001
流程开始时间:Thu Oct 27 14:18:28 CST 2022
流程结束时间:Thu Oct 27 16:40:51 CST 2022

历史变量实例查询

获取已完成的、id为’XXX’的流程实例中,所有的HistoricVariableInstances(历史变量实例),并以变量名排序。

historyService.createHistoricVariableInstanceQuery()
  .processInstanceId("XXX")
  .orderByVariableName.desc()
  .list();
@Test
public void QueryHistoryVariables() {
	// 获取流程引擎对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    HistoryService historyService = processEngine.getHistoryService();
    List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery()
			.processInstanceId("2c495021-55bf-11ed-a800-005056c00001")
            .list();
	if (list != null && list.size() > 0) {
		for (HistoricVariableInstance hvi : list) {
			System.out.println("流程变量ID:" + hvi.getId());
            System.out.println("流程实例ID:" + hvi.getProcessInstanceId());
            System.out.println("变量名称:" + hvi.getVariableName());
            System.out.println("变量的值:" + hvi.getValue());
            System.out.println("变量的创建时间:" + DateUtil.format(hvi.getCreateTime(), "yyyy-MM-dd HH:mm:ss"));
        	System.out.println("###############################################");
		}
	}
}

流程变量ID:2c499e42-55bf-11ed-a800-005056c00001
流程实例ID:2c495021-55bf-11ed-a800-005056c00001
变量名称:nrOfHolidays
变量的值:3
变量的创建时间:2022-10-27 14:18:28
###############################################
流程变量ID:2c49ec63-55bf-11ed-a800-005056c00001
流程实例ID:2c495021-55bf-11ed-a800-005056c00001
变量名称:description
变量的值:工作累了,想出去玩玩
变量的创建时间:2022-10-27 14:18:28
###############################################
流程变量ID:2c49ec64-55bf-11ed-a800-005056c00001
流程实例ID:2c495021-55bf-11ed-a800-005056c00001
变量名称:employee
变量的值:小王
变量的创建时间:2022-10-27 14:18:28
###############################################
流程变量ID:45f4b054-55c7-11ed-80ee-005056c00001
流程实例ID:2c495021-55bf-11ed-a800-005056c00001
变量名称:executeType
变量的值:YES
变量的创建时间:2022-10-27 15:16:27
###############################################

历史活动实例查询

获取最新的、已完成的、流程定义的id为XXX的、服务任务类型的HistoricActivityInstance(历史活动实例)。

historyService.createHistoricActivityInstanceQuery()
  .activityType("serviceTask")
  .processDefinitionId("XXX")
  .finished()
  .orderByHistoricActivityInstanceEndTime().desc()
  .listPage(0, 1);
@Test
public void QueryHistoryActivity() {
	// 获取流程引擎对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    HistoryService historyService = processEngine.getHistoryService();
    List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery()
			.processInstanceId("2c495021-55bf-11ed-a800-005056c00001")
            .orderByHistoricActivityInstanceStartTime().asc()
            .list();
	if (list != null && list.size() > 0) {
		for (HistoricActivityInstance hai : list) {
			System.out.println("历史活动ID:" + hai.getId());
            System.out.println("流程定义ID:" + hai.getProcessDefinitionId());
            System.out.println("流程开始时间:" + DateUtil.format(hai.getStartTime(), "yyyy-MM-dd HH:mm:ss"));
            System.out.println("流程结束时间:" + DateUtil.format(hai.getEndTime(), "yyyy-MM-dd HH:mm:ss"));
            System.out.println("流程的处理人是:" + hai.getAssignee());
            System.out.println("#####################");
		}
	}
}

==>  Preparing: select RES.* from ACT_HI_ACTINST RES WHERE RES.PROC_INST_ID_ = ? order by START_TIME_ asc 
==> Parameters: 2c495021-55bf-11ed-a800-005056c00001(String)
<==      Total: 11

历史活动ID:2c4a1376-55bf-11ed-a800-005056c00001
流程定义ID:MyLeave:1:8c16935c-5544-11ed-b9df-005056c00001
流程开始时间:2022-10-27 14:18:28
流程结束时间:2022-10-27 14:18:28
流程的处理人是:null
#####################
历史活动ID:2c4cd298-55bf-11ed-a800-005056c00001
流程定义ID:MyLeave:1:8c16935c-5544-11ed-b9df-005056c00001
流程开始时间:2022-10-27 14:18:28
流程结束时间:2022-10-27 15:16:27
流程的处理人是:张主管
#####################
历史活动ID:4608ad88-55c7-11ed-80ee-005056c00001
流程定义ID:MyLeave:1:8c16935c-5544-11ed-b9df-005056c00001
流程开始时间:2022-10-27 15:16:28
流程结束时间:2022-10-27 16:40:51
流程的处理人是:李经理
#####################

历史详情查询

下面的的例子获取id为123的流程中所有的变量更新记录。这个查询只会返回HistoricVariableUpdate(历史变量更新)。请注意一个变量名可能会有多个HistoricVariableUpdate实体,这代表了流程中的每一次变量更新。可以使用orderByTime(按变量更新的时间)或orderByVariableRevision(按变量更新的版本号)对这些更新记录进行排序。

historyService.createHistoricDetailQuery()
  .variableUpdates()
  .processInstanceId("123")
  .orderByVariableName().asc()
  .list()

下面的例子获取流程id为"123"的、启动时提交或任何任务中提交的所有表单参数。这个查询只会返回HistoricFormProperties(历史表单参数)。

historyService.createHistoricDetailQuery()
  .formProperties()
  .processInstanceId("123")
  .orderByVariableName().asc()
  .list()

最后一个例子获取id为"123"的任务进行的所有变量更新操作。将返回该任务设置的所有变量(任务局部变量)的HistoricVariableUpdates,而不会返回流程实例中设置的变量。

historyService.createHistoricDetailQuery()
  .variableUpdates()
  .taskId("123")
  .orderByVariableName().asc()
  .list()

历史任务实例查询

获取所有任务中,完成所花费时间(持续时间)排名前10的、已完成的HistoricTaskInstance(历史任务实例)。

historyService.createHistoricTaskInstanceQuery()
  .finished()
  .orderByHistoricTaskInstanceDuration().desc()
  .listPage(0, 10);

获取删除原因包含"invalid"的、最终指派给kermit用户的HistoricTaskInstance。

historyService.createHistoricTaskInstanceQuery()
  .finished()
  .taskDeleteReasonLike("%invalid%")
  .taskAssignee("kermit")
  .listPage(0, 10);
@Test
public void QueryHistoryTask() {
	// 获取流程引擎对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    HistoryService historyService = processEngine.getHistoryService();
    List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
			.processInstanceId("2c495021-55bf-11ed-a800-005056c00001")
            .orderByHistoricTaskInstanceStartTime().asc()
            .list()
    if (list != null && list.size() > 0) {
		for (HistoricTaskInstance hti : list) {
        	System.out.println("历史任务ID:" + hti.getId());
            System.out.println("流程定义ID:" + hti.getProcessDefinitionId());
            System.out.println("流程执行实例ID:" + hti.getExecutionId());
            System.out.println("流程结束时间:" + DateUtil.format(hti.getEndTime(), "yyyy-MM-dd HH:mm:ss"));
            System.out.println("流程的处理人是:" + hti.getAssignee());
            System.out.println("################################");
		}
	}
}

==>  Preparing: select distinct RES.* from ACT_HI_TASKINST RES WHERE RES.PROC_INST_ID_ = ? order by RES.START_TIME_ asc 
==> Parameters: 2c495021-55bf-11ed-a800-005056c00001(String)
<==      Total: 2

历史任务ID:2c5277e9-55bf-11ed-a800-005056c00001
流程定义ID:MyLeave:1:8c16935c-5544-11ed-b9df-005056c00001
流程执行实例ID:2c4a1375-55bf-11ed-a800-005056c00001
流程结束时间:2022-10-27 15:16:27
流程的处理人是:张主管
################################
历史任务ID:4608d499-55c7-11ed-80ee-005056c00001
流程定义ID:MyLeave:1:8c16935c-5544-11ed-b9df-005056c00001
流程执行实例ID:2c4a1375-55bf-11ed-a800-005056c00001
流程结束时间:2022-10-27 16:40:51
流程的处理人是:李经理
################################

到此这篇关于Flowable历史查询实例分析的文章就介绍到这了,更多相关Flowable历史查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RocketMQ实现消息分发的步骤

    RocketMQ实现消息分发的步骤

    RocketMQ 实现消息分发的核心机制是通过 Topic、Queue 和 Consumer Group 的配合实现的,下面给大家介绍RocketMQ实现消息分发的步骤,感兴趣的朋友一起看看吧
    2024-03-03
  • Maven Plugin的@Mojo和@Execute的具体使用

    Maven Plugin的@Mojo和@Execute的具体使用

    本文主要介绍了Maven Plugin的@Mojo和@Execute的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 详解java为什么不允许类多重继承却允许接口多重继承

    详解java为什么不允许类多重继承却允许接口多重继承

    这篇文章主要介绍了java为什么不允许类多重继承却允许接口多重继承,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Springboot访问templates html页面过程详解

    Springboot访问templates html页面过程详解

    这篇文章主要介绍了Springboot访问templates html页面过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • java图片缩放实现图片填充整个屏幕

    java图片缩放实现图片填充整个屏幕

    这篇文章主要介绍了java图片缩放实现图片填充整个屏幕,本文提供了两种解决方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 一文搞懂Java的SPI机制(推荐)

    一文搞懂Java的SPI机制(推荐)

    Java定义了一套JDBC的接口,但并未提供具体实现类,而是在不同云厂商提供的数据库实现包。这篇文章给大家介绍Java的SPI机制,感兴趣的朋友一起看看吧
    2021-11-11
  • 从内存地址解析Java的static关键字的作用

    从内存地址解析Java的static关键字的作用

    这篇文章主要介绍了从内存地址解析Java的static关键字的作用,包括静态成员变量和静态方法等重要内容,需要的朋友可以参考下
    2015-10-10
  • Java NIO下ByteBuffer的常用方法学习

    Java NIO下ByteBuffer的常用方法学习

    这篇文章主要带大家来初步学习一下NIO 中的 ByteBuffer的应用与常用方法,文中的示例代码讲解详细,对我们深入学习Java有一定的帮助,感兴趣的可以了解一下
    2023-05-05
  • Java实现克隆的三种方式实例总结

    Java实现克隆的三种方式实例总结

    这篇文章主要介绍了Java实现克隆的三种方式,结合实例形式总结分析了java浅复制、深复制以及使用serializable实现深复制的相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • 浅析Java迭代器Iterator和Iterable的区别

    浅析Java迭代器Iterator和Iterable的区别

    Java语言中,Iterator和Iterable都是用来遍历集合类数据结构的接口,虽然它们有很多相似的地方,但在具体实现中却有着一些不同之处,本文将详细分析它们的区别,并提供相应的代码示例,需要的朋友可以参考下
    2023-07-07

最新评论