跳到主要内容

流程实例迁移

Doubao 中英对照 Process Instance Migration

当流程定义更新为新版本时,就会产生这样一个问题:对于正在运行的、使用旧版本流程定义的流程实例,应该如何处理。
如果需要将正在运行的流程实例迁移到另一个流程定义版本,可以使用 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 完成时,该流程实例将结束。

支持的流程实例迁移场景​

本节概述流程实例迁移所支持的场景。
如果你要找的场景尚未受支持,请查看下一节中即将支持的功能。

  • 将等待状态(用户任务、接收任务、中间捕获事件)自动迁移到新流程定义版本中具有相同 id 的活动。
  • 通过为正在运行的流程实例中的某个特定活动状态指定目标活动,手动迁移等待状态。
  • 将等待状态迁移到带有边界定时器、信号或消息事件的活动。
  • 将带有边界定时器、信号或消息事件的等待状态迁移到不带边界事件的活动。
  • 将等待状态迁移到嵌入式子流程或嵌套嵌入式子流程中的活动。
  • 将嵌入式子流程或嵌套嵌入式子流程中的等待状态迁移到流程定义的根级别或另一个嵌套作用域。
  • 将等待状态迁移到(嵌套的)事件子流程中的活动,包括中断型和非中断型。
  • 在使用并行网关或包容网关时,将多个执行迁移到网关作用域之外的某一个执行。
  • 在并行网关或包容网关内,从单个执行迁移到多个执行。
  • 将等待状态迁移到父流程中的活动。

即将支持的流程实例迁移功能​

在当前版本的 Flowable Engine 中,我们迈出了流程实例迁移支持的第一步。在下一版本中,我们将重点为以下迁移场景添加支持:

  • 支持将一组多实例执行迁移到另一个活动。
  • 支持将等待状态迁移到多实例活动。
  • 当流程定义中存在一个或多个调用活动时,支持将等待状态迁移到子流程中的活动。
  • 支持在流程实例或本地执行作用域中添加和删除变量。
  • 支持定义目标用户任务的分配规则和其他配置选项。