public ServiceResponse<SolverInstance> getSolverWithBestSolution(String containerId, String solverId) { try { SolverInstanceContext sic = solvers.get(SolverInstance.getSolverInstanceKey(containerId, solverId)); if (sic != null) { updateSolverInstance(sic); sic.getInstance().setBestSolution(sic.getSolver().getBestSolution()); return new ServiceResponse<>(ServiceResponse.ResponseType.SUCCESS, "Best computed solution for '" + solverId + "' successfully retrieved from container '" + containerId + "'", sic.getInstance()); } else { return new ServiceResponse<>(ServiceResponse.ResponseType.FAILURE, "Solver '" + solverId + "' not found in container '" + containerId + "'", null); } } catch (Exception e) { logger.error("Error retrieving solver '" + solverId + "' state from container '" + containerId + "'", e); return new ServiceResponse<>(ServiceResponse.ResponseType.FAILURE, "Error retrieving solver '" + solverId + "' state from container '" + containerId + "'" + e.getMessage(), null); } }
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); } } }); }