💖专栏简介
✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。
✔️文章中只包含演示核心代码及测试数据,完整代码可查看作者的开源项目snail-camunda
✔️请给snail-camunda 点颗星吧😘
💖历史记录
流程引擎维护数据库中正在运行的流程实例的状态。这包括(1)在流程实例达到等待状态时将其状态写入数据库,以及(2)在流程继续执行时读取该状态。我们称这个数据库为运行时数据库。
除了维护运行时状态之外,流程引擎还创建一个审核日志,提供关于已执行流程实例的审核信息。我们称这个事件流为历史事件流。组成此事件流的单个事件称为历史事件,包含有关已执行流程实例、活动实例、已更改流程变量等的数据。
在默认配置中,流程引擎只会把事件流中一些简单的数据写入历史数据库。可以通过HistoryService API查询这个数据库(5)。
历史数据库和历史服务是可选组件;如果历史事件流没有记录到历史数据库中,或者如果用户选择将事件记录到不同的数据库中,则流程引擎仍然能够工作,并且仍然能够填充历史事件流。因为BPMN 2.0核心引擎组件不从历史数据库读取状态。还可以使用流程引擎配置中的historyLevel设置来配置记录的数据量。
由于流程引擎不依赖于历史数据库的存在来生成历史事件流,因此可以提供不同的后端来存储历史事件流。默认后端是DbHistoryEventHandler,它将事件流记录到历史数据库中。可以交换后端并为历史事件日志提供自定义存储机制。
🧡历史记录的等级
历史记录的等级主要是控制流程引擎通过历史事件流时所需存储的数据量。
- NONE:不触发历史事件
- ACTIVITY: 触发以下事件:
-
- 在流程实例【Process Instance】启动、更新、结束和迁移时触发
- 在案例实例【Case Instance】创建、更新和关闭触发
- 在活动实例【Activity Instance】被启动,更新,结束和迁移时触发
- 在案例活动实例【Case Activity Instance】创建、更新和结束时触发
- 在任务实例【Task Instance】被创建、更新(即重新分配、委托等)、完成、删除和迁移时触发。
- AUDIT:除了级别为ACTIVITY时触发的事件之外还会触发以下事件:
-
- 在流程变量被创建、更新、删除和迁移时触发。默认的历史后端(DbHistoryEventHandler)将变量实例事件写入历史变量实例数据库表。此表中的行随着变量实例的更新而更新,也就是只有流程变量的最后一个值可用。
- FULL: 除了级别是AUDIT时触发的事件之外还会触发以下事件:
-
- 在创建和/或更新表单属性时触发
- 用户的操作日志更新:当用户执行操作时触发,如声明用户任务,委派用户任务等。
- 在事件被创建、删除、解决和迁移时触发
- 当作业正在创建、作业执行失败或成功、作业被删除时触发
- 当一个决策被DMN引擎计算时触发。
- 批量开启和结束
- 当添加、删除身份信息、更改用户任务的受让人、更改用户任务的所有者时触发。
- 外部任务创建、删除或外部任务执行失败或成功时触发
- AUTO: 如果多个引擎使用同一个数据库,这种情况下所有引擎要使用相同的历史记录等级。使用AUTO级别,引擎将自动确定数据库中已配置的级别。如果未找到,则使用默认值。
🧡历史流程实例的状态值
对于流程实例,流程引擎将在历史记录数据库中创建对应的记录,并将在流程执行期间不断更新此记录。
- ACTIVE - 运行中的流程实例
- SUSPENDED - 挂起的流程实例
- COMPLETED - 通过正常的结束事件完成
- EXTERNALLY_TERMINATED - 从外部终止, 比如通过REST API
- INTERNALLY_TERMINATED - 在内部终止,例如通过终止边界事件
🧡历史记录的查询
比如查询用户的已办任务
List<HistoricTaskInstance> 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);
如果需要缩小查询报告的范围,可以使用以下方法:
- startedBefore:只考虑在给定日期之前启动的历史流程实例。
- startafter:只考虑在给定日期之后启动的历史流程实例。
- processDefinitionIdIn:只考虑给定流程定义id的历史流程实例。
- processDefinitionKeyIn:只考虑给定流程定义键的历史流程实例。
🧡任务报告
对于任务来说报告有两种类型:计数和持续时间
比如根据任务名计数:
historyService.createHistoricTaskInstanceReport()
.countByTaskName();
也可以根据流程定义Key去统计 【countByProcessDefinitionKey()】