如何在Java Spring应用中检测OptaPlanner求解器停止运行?
OptaPlanner求解器停止时触发操作的解决方案
当然可以通过监听器实现,OptaPlanner内置了生命周期事件监听机制,能直接捕获求解器的停止状态,进而处理最终结果。
方法1:实现SolverEventListener监听终止事件
这是最直接的方式,通过实现SolverEventListener接口,重写solverTerminated方法,该方法会在求解器停止(包括超时、手动终止、找到最优解)时自动触发:
public class CustomSolverListener implements SolverEventListener<YourSolutionType> { @Override public void solverTerminated(SolverEvent<YourSolutionType> event) { YourSolutionType bestSolution = event.getBestSolution(); // 在这里执行结果处理逻辑,比如持久化、返回给业务模块等 System.out.println("求解器已停止,当前最优解:" + bestSolution); } }
然后给求解器注册这个监听器即可:
// 构建求解器 SolverFactory<YourSolutionType> solverFactory = SolverFactory.createFromXmlResource("your-solver-config.xml"); Solver<YourSolutionType> solver = solverFactory.buildSolver(); // 注册自定义监听器 solver.addEventListener(new CustomSolverListener()); // 启动求解(同步场景) YourSolutionType finalSolution = solver.solve(yourProblem); // 异步场景则用SolverManager,同样可以注册监听器
方法2:用SolverManager的异步回调(异步求解场景)
如果你的应用是用SolverManager做异步求解,还可以直接通过solveAndListen方法的终止回调处理结果:
SolverManager<YourSolutionType, Long> solverManager = SolverManager.create(solverFactory); solverManager.solveAndListen( 1L, // 任务ID problem -> yourProblem, // 问题构造逻辑 (solutionId, intermediateSolution) -> { // 可选:每次找到更优解时的回调 }, (solutionId, finalSolution) -> { // 求解器终止时触发这里,处理最终结果 System.out.println("求解器终止,最终解:" + finalSolution); } );
注意事项
solverTerminated方法是在求解器的工作线程中执行的,如果涉及UI更新、线程安全操作,需要切换到对应线程处理(比如JavaFX的Platform.runLater)。- 无论求解器是因超时、手动终止还是完成求解目标停止,上述监听逻辑都会触发,能覆盖所有终止场景。
内容的提问来源于stack exchange,提问作者user21986685
相关产品推荐
相关产品推荐

