private SolverInstanceContext internalDisposeSolver(String containerId, String solverId) { // need to dispose resources here SolverInstanceContext sic = solvers.remove(SolverInstance.getSolverInstanceKey(containerId, solverId)); if (sic != null) { synchronized (sic) { if (sic.getInstance().getStatus() == SolverInstance.SolverStatus.SOLVING) { terminateSolverEarly(sic); } } } return sic; }
private void terminateSolverEarly(SolverInstanceContext sic) { synchronized (sic) { if (sic.getInstance().getStatus() == SolverInstance.SolverStatus.SOLVING) { sic.getInstance().setStatus(SolverInstance.SolverStatus.TERMINATING_EARLY); } } sic.getSolver().terminateEarly(); } }
if (sic != null) { synchronized (sic) { switch (sic.getInstance().getStatus()) { case SOLVING: { boolean everyProblemFactChangeProcessed = sic.getSolver().isEveryProblemFactChangeProcessed(); "Solver '" + solverId + "' on container '" + containerId + "' is in unrecognized state '" + sic.getInstance().getStatus() + "'.");
if (instance.getStatus() == null) { instance.setStatus(SolverInstance.SolverStatus.NOT_SOLVING);
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); } } }); }