9.2. 解决并侦听显示进度

当用户等待解决方案时运行解决者时,用户可能需要等待几分钟或小时后才能获得结果。为确保用户一切正常,通过显示最佳解决方案和目前最佳分数来显示进度。

流程

  1. 要处理中间的最佳解决方案,请使用 solveAndListen (…​)

    public class TimeTableService {
    
        private SolverManager<TimeTable, Long> solverManager;
    
        // Returns immediately
        public void solveLive(Long timeTableId) {
            solverManager.solveAndListen(timeTableId,
                    // Called once, when solving starts
                    this::findById,
                    // Called multiple times, for every best solution change
                    this::save);
        }
    
        public TimeTable findById(Long timeTableId) {...}
    
        public void save(TimeTable timeTable) {...}
    
        public void stopSolving(Long timeTableId) {
            solverManager.terminateEarly(timeTableId);
        }
    
    }

    这种实施使用数据库与 UI 通信,后者轮询数据库。更高级的实施将最佳解决方案直接推送到 UI 或消息传递队列。

  2. 当用户对中间最佳解决方案满意且不想再等待更好的解决方案时,请调用 SolverManager.terminateEarly (problemId)