✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。
✔️文章中只包含演示核心代码及测试数据,完整代码可查看作者的开源项目snail-camunda
✔️请给snail-camunda 点颗星吧
流程引擎维护数据库中正在运行的流程实例的状态。这包括(1)在流程实例达到等待状态时将其状态写入数据库,以及(2)在流程继续执行时读取该状态。我们称这个数据库为运行时数据库。
除了维护运行时状态之外,流程引擎还创建一个审核日志,提供关于已执行流程实例的审核信息。我们称这个事件流为历史事件流。组成此事件流的单个事件称为历史事件,包含有关已执行流程实例、活动实例、已更改流程变量等的数据。
在默认配置中,流程引擎只会把事件流中一些简单的数据写入历史数据库。可以通过HistoryService API查询这个数据库(5)。
历史数据库和历史服务是可选组件;如果历史事件流没有记录到历史数据库中,或者如果用户选择将事件记录到不同的数据库中,则流程引擎仍然能够工作,并且仍然能够填充历史事件流。因为BPMN 2.0核心引擎组件不从历史数据库读取状态。还可以使用流程引擎配置中的historyLevel设置来配置记录的数据量。
由于流程引擎不依赖于历史数据库的存在来生成历史事件流,因此可以提供不同的后端来存储历史事件流。默认后端是DbHistoryEventHandler,它将事件流记录到历史数据库中。可以交换后端并为历史事件日志提供自定义存储机制。
历史记录的等级主要是控制流程引擎通过历史事件流时所需存储的数据量。
对于流程实例,流程引擎将在历史记录数据库中创建对应的记录,并将在流程执行期间不断更新此记录。
比如查询用户的已办任务
List historicTasks = historyService.createHistoricTaskInstanceQuery()
.tenantIdIn(tenantId)
.processInstanceBusinessKey(businessKey)
.taskAssignee(userId)
.finished()
.taskDeleteReason("completed")
.list();
查询某个业务关联的流程耗时最长的10条流程实例
historyService.createHistoricProcessInstanceQuery()
.finished()
.processInstanceBusinessKey("XXX")
.orderByProcessInstanceDuration().desc()
.listPage(0, 10);
这些报告包括在指定时间段内启动的所有已完成流程实例的最长、最短和平均持续时间。
例如下图显示的是自引擎启动以来每个月的报告
historyService.createHistoricProcessInstanceReport()
.duration(PeriodUnit.MONTH);
如果需要缩小查询报告的范围,可以使用以下方法:
对于任务来说报告有两种类型:计数和持续时间
比如根据任务名计数:
historyService.createHistoricTaskInstanceReport()
.countByTaskName();
也可以根据流程定义Key去统计 【countByProcessDefinitionKey()】