private void updateSolverStatus(SolverInstanceContext sic) { Solver<?> solver = sic.getSolver(); if (!solver.isSolving()) { // TODO BUGGY because a solver might have been a scheduled to start, but not started yet // (especially immediately after solvePlanningProblem() call). sic.getInstance().setStatus(SolverInstance.SolverStatus.NOT_SOLVING); } else if (solver.isTerminateEarly()) { sic.getInstance().setStatus(SolverInstance.SolverStatus.TERMINATING_EARLY); } else { sic.getInstance().setStatus(SolverInstance.SolverStatus.SOLVING); } }
private void terminateSolverEarly(SolverInstanceContext sic) { synchronized (sic) { if (sic.getInstance().getStatus() == SolverInstance.SolverStatus.SOLVING) { sic.getInstance().setStatus(SolverInstance.SolverStatus.TERMINATING_EARLY); } } sic.getSolver().terminateEarly(); } }
private void solvePlanningProblem(final SolverInstanceContext sic, final Object planningSolution) { sic.getInstance().setBestSolution(null); sic.getInstance().setStatus(SolverInstance.SolverStatus.SOLVING); this.executor.execute(() -> { try { // If the executor's queue is full, it's possible that the solver gets canceled before it starts SolverInstance.SolverStatus status; synchronized (sic) { status = sic.getInstance().getStatus(); // TODO Race condition: status turns into non-solving before solver starts // See https://issues.jboss.org/browse/PLANNER-540 } if (status == SolverInstance.SolverStatus.SOLVING) { sic.getSolver().solve(planningSolution); } } catch (Exception e) { logger.error("Exception executing solver '" + sic.getInstance().getSolverId() + "' from container '" + sic.getInstance().getContainerId() + "'. Thread will terminate.", e); } finally { synchronized (sic) { sic.getInstance().setStatus(SolverInstance.SolverStatus.NOT_SOLVING); } } }); }
instance.setStatus(SolverInstance.SolverStatus.NOT_SOLVING);