OptaPlanner 7.x → 8.x 升级 Checklist

适用场景:APS / 排程系统、使用 ConstraintStream 或 Drools DRL、依赖实时规划(Real-time Planning)

参考来源:OptaPlanner 发展方向与问题


一、升级前评估(必做)

  • 确认当前版本

    • 当前 OptaPlanner 版本:_______(例如 7.44.0.Final)

    • 是否使用 Drools DRL 评分:✅ 是 / ❌ 否

    • 是否使用链式规划(@PlanningChain/ PlanningVariable(graphType = CHAINED)):✅ 是 / ❌ 否

    • 是否使用 VariableListener:✅ 是 / ❌ 否

    • 是否使用实时规划(SolverManager.addProblemChange()):✅ 是 / ❌ 否

  • 确认目标版本

    • 计划升级到:8.___.Final

    • Spring Boot 版本是否 ≥ 2.7(8.x 最低要求)

  • 阅读官方迁移指南

    • OptaPlanner 8 Migration Guide

    • 重点关注 ConstraintStream 与 Drools 的生命周期说明

二、依赖与构建配置

  • 升级 OptaPlanner BOM / Dependency
XML 复制代码
<dependency>
  <groupId>org.optaplanner</groupId>
  <artifactId>optaplanner-core</artifactId>
  <version>8.x.x.Final</version>
</dependency>
  • 移除或升级 Drools 相关依赖

    • 若计划保留 Drools:确认 optaplanner-drools版本一致

    • 若计划迁移:移除 optaplanner-droolskie-ci等依赖

  • 清理本地构建缓存

    • Maven:mvn clean

    • Gradle:gradle clean build --refresh-dependencies


三、API 迁移(核心修改)

1. ConstraintProvider(ApsConstraintProvider.java

  • penalize / reward 方法签名调整
java 复制代码
// 7.x
.penalize("超时惩罚", HardSoftScore.ONE_HARD);

// 8.x
.penalize(HardSoftScore.ONE_HARD)
.asConstraint("超时惩罚");
  • 统一约束命名规则

    • 所有约束均以 asConstraint("xxx")结尾

    • 避免匿名约束,便于调试与分数分析

  • 验证所有 ConstraintStream 流

    • from()/ join()/ ifExists()行为是否变化

    • 是否存在因类型推断导致的编译错误


2. VariableListener 包路径变更

  • 修改 import 语句
java 复制代码
// 7.x
import org.optaplanner.core.impl.domain.variable.listener.VariableListener;
import org.optaplanner.core.impl.score.director.ScoreDirector;

// 8.x
import org.optaplanner.core.api.domain.variable.VariableListener;
import org.optaplanner.core.api.score.director.ScoreDirector;
  • 检查所有自定义 VariableListener

    • 文件名示例:*VariableListener.java

    • 确认无 impl包残留引用


3. ScoreDirector API 变更

  • 字符串属性名 → 方法引用
java 复制代码
// 7.x
scoreDirector.beforeVariableChanged(entity, "planStartTime");
scoreDirector.afterVariableChanged(entity, "planStartTime");

// 8.x
scoreDirector.beforeVariableChanged(entity, Entity::getPlanStartTime);
scoreDirector.afterVariableChanged(entity, Entity::getPlanStartTime);
  • 全局搜索关键词

    • beforeVariableChanged

    • afterVariableChanged

    • variableChanged


四、实时规划(Real-time Planning)适配

1. ProblemChange 接口统一

  • 确认所有实时变更逻辑已迁移到 ProblemChange
java 复制代码
public class AddTaskProblemChange implements ProblemChange<Schedule> {
    @Override
    public void doChange(Schedule schedule, ScoreDirector<Schedule> scoreDirector) {
        // ...
    }
}
  • 移除旧版实时规划相关代码

    • Solver.addEntity()

    • Solver.removeEntity()

    • Solver.addProblemFact()


2. SolverManager Problem ID 治理(⚠️ 重要)

参考博文:SolverManager 存在 Problem ID 复用异常问题

  • 平台侧接管 Problem ID 生成

    • 客户端传入业务 ID(如 orderId

    • 平台生成内部 problemId(UUID / 自增 ID)

  • 接口层改造

    • 启动规划:返回内部 problemId

    • 查询 / 终止 / 实时变更:使用内部 problemId

  • 增加 Problem ID 清理机制

    • 规划完成后主动调用 solverManager.close(solverJobId)

    • 避免异常中断导致状态残留


五、链式规划与新特性评估

1. 现有链模型(CHAINED)

  • 暂不迁移到 @PlanningListVariable

    • 确认当前链模型运行稳定

    • 8.x 新链模型尚未完全成熟(参考博文)

  • 验证 Shadow Variable 行为

    • @CustomShadowVariable监听器是否正常触发

    • 时间计算逻辑是否与之前一致


2. 新特性试用(可选)

  • @PlanningListVariable(仅限新模块)

    • 明确标注为"实验性功能"

    • 准备回退方案

  • @IndexShadowVariable

    • 仅在非核心链路中试用

六、Drools DRL 迁移(长期必做)

Drools DRL 将在 OptaPlanner 9.x 移除

  • 制定 DRL → ConstraintStream 迁移计划

    • 优先级:核心约束 > 次要约束 > 调试约束
  • 增量迁移

    • 每次迁移 1--2 条约束

    • 对比新旧分数结果一致性

  • 或评估 Incremental Java Score Calculation

    • 性能要求极高时考虑

    • 实现成本较高(参考博文)


七、测试与验证

  • 单元测试

    • 所有 ConstraintProvider 测试通过

    • 边界条件(空集合、单实体)验证

  • 集成测试

    • 典型业务场景全量规划

    • 实时规划(添加 / 删除任务)验证

  • 回归测试

    • 与 7.x 在相同数据集上运行

    • 对比解的质量与分数构成

    • 允许分数结构变化,但业务结果应一致

  • 性能测试

    • 规划耗时是否显著增加

    • GC / CPU 使用率是否在可接受范围


八、部署与回滚预案

  • 灰度发布

    • 先在非核心业务线启用 8.x

    • 观察 1--2 个迭代周期

  • 回滚方案

    • Git tag / 分支保留 7.x 稳定版本

    • 数据库 schema 无破坏性变更(如有需单独处理)

  • 监控增强

    • Solver 执行时长监控

    • Problem ID 泄漏检测

    • 异常 SolverJob 自动清理


九、升级完成确认

  • 所有 javax.*/ impl包引用已清除

  • 所有约束均有 asConstraint()命名

  • 实时规划功能经生产流量验证

  • 团队已了解 8.x API 变化点

  • 文档已更新(架构图、API 说明)


附录:常见搜索关键词(用于全局替换)

java 复制代码
beforeVariableChanged
afterVariableChanged
VariableListener
ScoreDirector
penalize(
reward(
impl.domain.variable
impl.score.director

✅ 预计修改工作量:2--3 小时

✅ 主要风险点:SolverManager Problem ID 管理、新链模型成熟度

✅ 推荐节奏:先升级 + 稳定 API,再逐步迁移 Drools

复制代码
相关推荐
wdfk_prog2 分钟前
嵌入式面试真题第 10 题:高优化等级下共享状态可见性、内存模型与系统级同步设计
java·linux·开发语言·面试·职场和发展·架构·c
卓怡学长11 分钟前
w255基于springboot仓库管理系统
java·数据库·spring boot·spring·intellij-idea
J-Tony113 小时前
【Redis】 Redis 是单线程还是多线程
服务器·数据库·mysql
这个DBA有点耶3 小时前
SQL调优进阶:从“优化一条SQL”到“优化一个系统”的思维升级
java·大数据·数据库·sql·程序人生·dba·改行学it
IvorySQL3 小时前
PG 日报|SQL/PGQ 图查询基于联接重写机制实现
数据库·人工智能·sql·postgresql·区块链·ivorysql
csdn2015_3 小时前
springboot读取配置的方法
java·spring boot·spring
AOwhisky4 小时前
下一代容器来了?Docker 宣布原生支持 WebAssembly
java·运维·docker·容器·rust·wasm
云云只是个程序马喽6 小时前
海外短剧平台搭建方案:私有化源码系统选型|云微短剧系统技术架构拆解
java·php
数聚天成DeepSData6 小时前
遥感农业数据集下载全攻略
数据库·人工智能·深度学习·机器学习·自然语言处理·数据挖掘
一勺菠萝丶6 小时前
生产环境平滑升级实战-Nginx维护页数据库迁移与安全回滚
数据库·nginx·安全