OptaPlanner Spring Boot下SolverManager提交ProblemFactChange咨询
功能进展说明
目前OptaPlanner官方尚未在SolverManager的稳定版API中提供原生的submitProblemFactChange()能力,该特性仍在官方迭代roadmap中,暂时没有明确的上线时间节点。
可行的Workaround方案
根据部署场景的不同,你可以选择以下两种经过实测的实现方案:
单节点部署场景
- 自定义一个全局线程安全的运行中Solver注册表,推荐使用
ConcurrentHashMap,key为你自定义的求解任务ID,value为对应任务的Solver实例 - 调用
SolverManager.solveAndListen()启动求解任务时,在求解回调监听器中拿到当前任务对应的Solver实例,将其存入上述注册表 - 需要提交事实变更时,从注册表中取出对应Solver实例,直接调用
solver.addProblemFactChange(change)方法即可,该方法本身是线程安全的,无需额外加锁 - 注意在求解任务结束、手动终止、抛出异常的回调节点,将对应Solver实例从注册表中移除,避免出现内存泄漏问题
分布式多节点部署场景
- 新增消息队列中间件,所有ProblemFactChange请求先发送到消息队列的对应主题
- 每个运行Solver服务的节点只监听分配到本节点的求解任务对应的变更消息,收到消息后调用本地运行的Solver实例的
addProblemFactChange()方法即可 - 配合外部存储(如Redis)记录每个求解任务所在的节点信息,用来路由变更请求到正确的节点即可
注意事项
- 所有自定义的ProblemFactChange实现类必须实现序列化接口,分布式场景下需确保变更对象可以正常在网络中传输
- 不要手动调用Solver实例的
solver.solve()、solver.terminate()等生命周期相关方法,避免和SolverManager的内部管理逻辑冲突 - 该方案在OptaPlanner 8.x、9.x版本上均可稳定运行
内容的提问来源于stack exchange,提问作者steve
相关产品推荐
相关产品推荐

