从 Activiti 迁移到 Flowable,需要迁移哪些数据库表和流程数据?

从 Activiti 迁移到 Flowable,不能把任务理解为“复制几张 ACT_ 表”。真正的迁移对象是一张有关联的数据图:流程定义、部署资源、执行树、任务、变量、作业、历史、身份、业务单据、表单附件和消息状态共同描述一个流程。

迁移前必须先确认 Activiti 来源版本、目标 Flowable 版本、数据库方言、历史级别、定制扩展和运行实例复杂度。不同版本的可行路线差异很大:有的可以使用官方升级脚本,有的应让旧实例自然跑完,还有的必须按平台迁移重新设计。

一、先给结论:迁移对象不是表,而是关联数据图

在这里插入图片描述

图 1 流程定义、运行实例、历史、身份和业务数据必须按关联关系整体评估。

迁移对象至少分为六组:

数据域 典型表或对象 迁移重点
通用与资源 ACT_GE_PROPERTY、ACT_GE_BYTEARRAY Schema 版本、BPMN/XML、图片和二进制变量
定义与部署 ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF、ACT_RE_MODEL 部署资源、定义版本、模型编辑数据
运行时 ACT_RU_EXECUTION、TASK、VARIABLE、IDENTITYLINK 执行树、任务、变量和候选关系
作业与事件 Timer、Job、Event Subscription 等 表结构变化、锁、重试和异步边界
历史审计 ACT_HI_PROCINST、TASKINST、ACTINST、VARINST 完整轨迹、意见、附件和归档
引擎外数据 业务单、表单、附件、消息、门户待办 业务主键、状态、幂等和审计映射

只复制 ACT_RU_TASK 无法恢复待办,因为任务依赖流程实例、执行实例、流程定义、变量、身份链接和运行作业。只重新部署 BPMN 也不能让新定义接管旧执行树。

二、第一步:确认 Activiti 来源版本

1. Activiti 5.x

Flowable 与 Activiti 5 同源,官方迁移指南提供了从 Activiti 5 到 Flowable 6 的兼容路线。即便如此,也必须按官方版本顺序执行升级脚本,并验证自定义监听器、序列化变量和作业数据。

2. Activiti 6

Activiti 6 与 Flowable 在分叉后分别演进。表名前缀相同不代表官方承诺直接兼容,尤其要关注作业表拆分、公共表、历史表、字段长度和索引差异。应先对比源端真实 DDL 与目标版本脚本,再决定升级还是 ETL。

3. Activiti 7/Cloud

Activiti 7/Cloud 引入 Runtime Bundle、Query、Audit、Connector 和消息组件,迁移通常已经超出数据库升级范围。需要分别处理运行服务、查询审计、事件消息和部署拓扑,更接近平台架构迁移。

版本盘点应记录:

  • 引擎准确版本与历次升级路径;
  • 数据库类型、字符集和真实 DDL;
  • history level 与数据清理策略;
  • 自定义表、索引、触发器和存储过程;
  • JavaDelegate、监听器、表达式和自定义命令;
  • 当前运行实例、作业、定时器和失败任务数量。

三、定义与部署数据怎样迁移

定义域不能只看 ACT_RE_PROCDEF。ACT_RE_PROCDEF 记录流程定义元数据,真正的 BPMN XML、流程图、模型源文件和部分变量二进制内容通常保存在 ACT_GE_BYTEARRAY。

对象 处理建议
ACT_RE_DEPLOYMENT 保留部署 ID、时间、租户和类别关系
ACT_RE_PROCDEF 保留定义 ID、KEY、VERSION、DEPLOYMENT_ID 和资源名
ACT_RE_MODEL 区分运行必需数据和设计器草稿;必要时导出为独立模型资产
ACT_GE_BYTEARRAY 迁移 BPMN、PNG、模型源和变量二进制,并核对引用方
ACT_GE_PROPERTY 不直接照搬目标 Schema 版本号,由官方脚本管理

迁移 BPMN XML 时还要扫描:

  • Activiti 专属扩展命名空间;
  • class、delegateExpression、listener 和 script;
  • 表单键、候选人表达式和自定义属性;
  • 多实例、边界事件、调用活动和异步标记;
  • 流程定义 KEY、版本和业务启动入口。

更安全的做法是把每个已部署版本导出成独立资源,计算 hash,并在目标环境重新解析和部署;同时保存旧定义 ID 到新定义 ID 的映射。

四、运行实例为什么必须成组处理

运行实例的核心不是一行流程实例,而是一棵执行树。ACT_RU_EXECUTION 通过父子关系、流程实例 ID、定义 ID 和当前活动 ID 组织 Token;任务、变量、身份链接、事件订阅和作业都挂在这棵树上。

活动实例迁移至少要保持以下不变量:

  • 每个运行实例都能找到有效流程定义;
  • 每个任务都能找到执行实例和流程实例;
  • 局部变量的 EXECUTION_ID、TASK_ID 和作用域不丢失;
  • 候选人、候选组和任务责任人关系完整;
  • 并行、多实例和子流程的父子执行关系一致;
  • 定时器、消息订阅和异步作业与当前等待点相符。

作业数据通常是风险最高的一组。Activiti 不同版本和 Flowable 可能使用不同的运行作业、定时作业、挂起作业、死信作业和外部工作表。不要在异步执行器运行时迁移这些表,否则旧节点和新节点可能同时领取任务。

流程变量也常在最后一步暴露问题。字符串、数字和日期容易转换;Java 序列化对象依赖原类名、serialVersionUID 和类加载器,二进制变量还依赖 ACT_GE_BYTEARRAY。建议在迁移前把长期变量转换成 JSON 或明确的基础类型。

五、历史、身份与业务数据如何处理

ACT_HI_* 历史表不仅用于查看已办,还可能承担审计、报表、合规和业务追责。历史处理通常有三种策略:

  1. 全量迁移:统一查询体验最好,但转换和验证成本最高;
  2. 旧库只读:新历史写入 Flowable,门户聚合新旧查询;
  3. 归档到业务数据仓库:适合只需报表和合规检索的已结束实例。

无论采用哪种策略,都要保留流程实例、活动、任务、变量、意见、附件和业务键之间的关系。

ACT_ID_* 是否迁移取决于身份架构。如果企业用户和组织来自 AD、LDAP、IAM 或业务组织中心,通常不应把引擎身份表当作权威来源;但历史任务中的用户 ID 必须继续可解释,离职用户也不能在审计记录中消失。

引擎表之外还要一起处理:

  • 业务单据与流程实例 ID;
  • 表单定义、表单版本和字段权限;
  • 审批意见、签名、附件和抄送记录;
  • 门户待办、移动端未读数和消息状态;
  • 会签、加签、退回、撤回等平台操作日志;
  • 外部系统回调、幂等键和补偿状态。

在云程低代码开发平台这类长期演进系统中,表单、门户和业务模块应依赖稳定流程能力接口,由适配层映射 Activiti 或 Flowable。这样迁移影响集中在适配器和数据转换层。

六、三条迁移路线怎样选择

在这里插入图片描述

图 2 默认优先级是旧实例自然跑完,其次官方升级脚本,最后才是活动实例转换。

1. 路线一:旧实例自然跑完

Activiti 停止创建新实例,Flowable 接收新流程;统一门户在过渡期聚合两套待办和历史。此路线风险最低,不必转换执行树,适合流程周期可控、允许双轨运行的系统。

2. 路线二:使用官方升级脚本

适用于官方明确支持的同源版本路线。必须从源版本开始按顺序执行逐版本 DDL,不能跳过中间脚本,也不能只把目标建表脚本覆盖到旧库。

3. 路线三:转换活动实例

只有存量实例无法等待结束、官方路线不覆盖且企业能够承担专项改造时才选择。需要编写 ETL 和映射规则,并对并行、多实例、子流程、作业、局部变量和历史进行专项验证。

路线选择应由“版本兼容性、运行实例复杂度、最长流程周期、停机窗口、双轨能力和审计要求”共同决定,而不是由表数量决定。

七、一套可执行的数据库迁移步骤

在这里插入图片描述

图 3 结构升级与业务放量分开执行,异步执行器最后启动。

1. 数据盘点

统计定义、部署、运行实例、任务、变量、作业、历史、身份和业务关联数量;导出真实 DDL,按业务域标记高风险流程。

2. 建立 ID 和关联不变量

明确哪些 ID 原样保留、哪些生成映射;固定业务键、定义 KEY、租户、流程实例和业务单据之间的关系。

3. 在生产副本完整演练

从真实生产快照执行全部 DDL、ETL、模型转换和验证,记录每一步耗时、锁表影响、失败恢复和回滚时间。

4. 冻结与冷备

停止新实例、任务提交、定时器和异步作业,记录冻结水位;备份数据库、对象存储、消息消费位点和应用版本。

5. 执行升级或 ETL

只使用与源版本、目标版本和数据库方言匹配的官方脚本;自定义转换必须可重复、可重入,并记录每批次结果。

6. 先核对数据,再启动异步执行器

先验证定义、人工任务、变量、历史和业务查询;最后再启动 Timer、Job 和异步执行器,避免错误结构被后台线程继续推进。

7. 灰度放量并保留回滚窗口

先开放查询和少量人工任务,再开放新实例和异步处理;明确回滚截止点,超过该点后采用前向修复而不是恢复旧快照。

八、数据校验应该检查什么

数据校验不能只比较总行数,至少包括:

校验维度 示例
数量 定义、实例、任务、变量、作业和历史行数
引用完整性 Task 是否能找到 Execution、ProcInst 和 ProcDef
执行树 父子 Execution、并行分支和多实例计数
变量 类型、作用域、二进制引用和 JSON 可解析性
作业 到期时间、重试次数、锁、异常和死信状态
业务关联 BUSINESS_KEY、业务单状态和流程实例 ID
历史 已办、意见、附件和节点轨迹可查询
行为 迁移后完成任务、触发定时器和消息能正确推进

建议准备一组黄金样本:普通审批、并行网关、会签、子流程、定时器、消息等待、失败作业、退回和撤回实例。每次演练都对比迁移前后的任务、变量、Token、轨迹和业务状态。

九、最常见的迁移误区

  • 表都有 ACT_ 前缀,所以可以直接复制;
  • 只迁 ACT_RU_TASK 就能恢复待办;
  • 重新部署 BPMN 就能接管旧实例;
  • 只迁运行表,不处理历史与业务审计;
  • 自动 Schema 更新启动成功就代表迁移成功;
  • 把 Java 序列化变量当作普通二进制;
  • 忽略会签、退回、撤回等平台扩展状态;
  • 只有数据库备份,没有旧应用、消息位点和外部副作用方案。

生产迁移建议关闭自动 Schema 更新,使用经过评审和演练的显式脚本。自动升级适合开发环境发现差异,不适合作为不可审计的生产割接方案。

十、最终结论

Activiti 到 Flowable 的迁移不是“表名一样就复制”,也不是“重新部署模型就结束”。定义、资源、执行树、任务、变量、作业、历史、身份和业务数据必须作为关联整体处理。

默认应优先让旧实例自然跑完;官方明确支持时使用逐版本升级脚本;活动实例转换只作为不能双轨、不能等待时的专项方案。

一句话总结:先确定版本和迁移路线,再保护 ID 与关联,最后用真实实例、业务状态和异常路径证明迁移成功。

posted @ 2026-08-11 16:55  大龄码农有梦想  阅读(14)  评论(0)    收藏  举报