public void solve()

in technology/kubernetes/school-timetabling/src/main/java/org/acme/schooltimetabling/messaging/MessageHandler.java [69:112]


    public void solve() {
        Long problemId = null;
        try (JMSContext context = connectionFactory.createContext(JMSContext.SESSION_TRANSACTED);
             JMSConsumer jmsConsumer = context.createConsumer(context.createQueue("school-timetabling-problem"))) {
            Queue solutionQueue = context.createQueue("school-timetabling-solution");
            JMSProducer jmsProducer = context.createProducer();
            Message solverRequestMessage = jmsConsumer.receive(1_000L);
            if (solverRequestMessage == null) {
                return;
            }
            try {
                SolverRequest solverRequest
                        = objectMapper.readValue(solverRequestMessage.getBody(String.class), SolverRequest.class);
                problemId = solverRequest.getProblemId();
            } catch (JsonProcessingException jsonProcessingException) { // Bad request.
                LOGGER.error("Unable to deserialize a solver request (" + solverRequestMessage + ").",
                        jsonProcessingException);
                context.rollback();
                return;
            }

            TimeTable problem = repository.load(problemId);
            TimeTable solution;

            LOGGER.debug("Started solving an input problem (" + problemId + ").");
            try {
                solution = solver.solve(problem);
            } catch (Exception solverException) { // Exception during solving will most likely require code change.
                LOGGER.error("Solving an input problem (" + problemId + ") has failed.", solverException);
                String errorMessage = createReplyFailure(problemId, solverException);
                jmsProducer.send(solutionQueue, errorMessage);
                context.commit();
                return;
            }

            repository.save(problemId, solution);
            LOGGER.debug("Solution saved for an input problem (" + problemId + ")");
            String solvingFinishedMessage = createReplySuccess(problemId);
            jmsProducer.send(solutionQueue, solvingFinishedMessage);
            context.commit(); // The output message is sent out and the input message removed from a queue.
        } catch (Exception ex) {
            throw new IllegalStateException("Exception during processing an input problem (" + problemId + ").", ex);
        }
    }