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);
}
}