流程实例迁移
当流程定义更新为新版本时,就会产生这样一个问题:对于正在运行的、使用旧版本流程定义的流程实例,应该如何处理。
如果需要将正在运行的流程实例迁移到另一个流程定义版本,可以使用 Flowable Engine 上的流程实例迁移功能。
简单示例
让我们从一个简单的示例开始,讲解 Flowable Engine 中流程实例迁移的基础知识。
在这个简单示例中,我们使用如下用例:
- 有一个流程实例正在运行,其流程定义的 key 为 simpleTasks,由一个开始事件 —— 用户任务 1 —— 结束事件组成。
- 该正在运行的流程实例在用户任务 1 处处于活动状态。
- 一个新的流程定义以相同的 key(simpleTasks)部署,该流程定义现在由一个开始事件 —— 用户任务 1 —— 用户任务 2 —— 结束事件组成。
- 该正在运行的流程实例应该迁移到新的流程定义。
要测试该流程实例能否顺利迁移,可以使用以下代码:
ProcessInstanceMigrationValidationResult validationResult = processMigrationService.createProcessInstanceMigrationBuilder()
.migrateToProcessDefinition(version2ProcessDef.getId())
.validateMigration(processInstanceToMigrate.getId());
boolean isMigrationValid = validationResult.isMigrationValid();
流程实例迁移构建器既可用于验证,也可用于(正如我们稍后将看到的)迁移一个或多个流程实例。
在本例中,我们测试正在运行的流程实例能否迁移到包含 2 个用户任务的新流程定义版本。
由于两个流程定义版本之间用户任务的 id 没有变化,因此无需任何额外的映射配置即可迁移该流程实例。
因此,迁移的 valid 布尔值将为 true。这意味着我们可以执行实际的迁移,而不会遇到预期之外的问题。
processMigrationService.createProcessInstanceMigrationBuilder()
.migrateToProcessDefinition(version2ProcessDef.getId())
.migrate(processInstanceToMigrate.getId());
在执行 migrate 方法之后,正在运行的流程实例被迁移到新的流程定义(包括历史信息)。
这意味着当用户任务 1 完成时,用户任务 2 将成为该正在运行的流程实例的下一个活动状态。
使用活动迁移映射进行迁移
在简单示例中,用户任务 1 被自动映射到新流程定义版本中的同一个用户任务。
但在某些情况下,正在运行的流程实例的当前活动在新流程定义中已不存在,或者由于其他原因该活动需要迁移到另一个活动。
对于这种用例,流程实例迁移构建器允许你指定一组特定的活动迁移映射。
processMigrationService.createProcessInstanceMigrationBuilder()
.migrateToProcessDefinition(version2ProcessDef.getId())
.addActivityMigrationMapping("userTask1Id", "userTask2Id")
.migrate(processInstanceToMigrate.getId());
在本例中,处于用户任务 1 活动状态的正在运行的流程实例将被迁移到包含 2 个用户任务的新流程定义版本,其活动状态将被迁移到用户任务 2。
这意味着当用户任务 2 完成时,该流程实例将结束。