gogoWebsite

Use of rabbitmq asynchronous messaging

Updated to 2 days ago
@Component @RabbitListener(queues = "rabbitmq-to-reply-queue") public class SolveReceive { @Autowired SolveService solveService; @Autowired SolveTestPointMapper solveTestPointMapper; @RabbitHandler @Transactional public void receiveMessage(String message) { try { JudgeMessage judgeMessage = JSON.parseObject(message, JudgeMessage.class); JudgeMessage.Body body; int solveId = Integer.parseInt(judgeMessage.getHeader().getId()); Solve solve = solveService.adminSelectSolveRecord(solveId); solve.setPass(true); if (judgeMessage.getResponseBody().getStatus().equals("ClientError")) { //Client format error List<SolveTestPoint> solveTestPoints = solveTestPointMapper.selectSolvePointResultBySolveId(solveId); for (SolveTestPoint solveTestPoint : solveTestPoints) { solveTestPoint.setDetailOfError(message); solveTestPoint.setResult("CLIENT_ERROR"); solveTestPoint.setMemory(-1); solveTestPoint.setTime(-1); solveTestPointMapper.updateRowBySolveIdAndTestPointId(solveTestPoint); } solve.setPass(false); solve.setResult("CLIENT_ERROR"); if (!solveService.adminUpdateSolveRecordStatus(solve)) { //Update failed to fallback status solveService.adminDeleteSolveRecord(solve.getId()); } } else if (judgeMessage.getResponseBody().getStatus().equals("InternalError")) { //The question is wrong List<SolveTestPoint> solveTestPoints = solveTestPointMapper.selectSolvePointResultBySolveId(solveId); for (SolveTestPoint solveTestPoint : solveTestPoints) { solveTestPoint.setDetailOfError(message); solveTestPoint.setResult("INTERNAL_ERROR"); solveTestPoint.setMemory(-1); solveTestPoint.setTime(-1); solveTestPointMapper.updateRowBySolveIdAndTestPointId(solveTestPoint); } solve.setPass(false); solve.setResult("INTERNAL_ERROR"); if (!solveService.adminUpdateSolveRecordStatus(solve)) { //Update failed to fallback status solveService.adminDeleteSolveRecord(solve.getId()); } } else { //Normal situation body = JSON.parseObject(judgeMessage.getResponseBody().getBody(), JudgeMessage.Body.class); boolean partlySolved = false; //Travel through the results of multiple test points and save for (Map.Entry<String, JudgeMessage.JudgeResponse> res : body.getPointJudgeResponseMap().entrySet()) { SolveTestPoint solveTestPoint = new SolveTestPoint(); solveTestPoint.setSolveId(solveId); solveTestPoint.setTestPointId(res.getKey()); String result = res.getValue().getJudgeResult(); solveTestPoint.setResult(result); if (result.equals("ACCEPT")) { JudgeMessage.RunningDetail detail = res.getValue().getRunningDetails(); solveTestPoint.setMemory(detail.getMemory()); solveTestPoint.setTime(detail.getTime()); partlySolved = true; } else { solveTestPoint.setMemory(-1); solveTestPoint.setTime(-1); if (res.getValue().getDetailOfError() != null) { solveTestPoint.setDetailOfError(res.getValue().getDetailOfError().toString()); } solve.setPass(false); } solveTestPointMapper.updateRowBySolveIdAndTestPointId(solveTestPoint); } if (solve.isPass()) { solve.setResult("ACCEPT"); } else { if (partlySolved) { solve.setResult("PARTLY_ACCEPT"); } else { solve.setResult("WRONG_ANSWER"); } } //Save the final result if (!solveService.adminUpdateSolveRecordStatus(solve)) { //Update failed to fallback status solveService.adminDeleteSolveRecord(solve.getId()); } } } catch (Exception e) { e.printStackTrace(); } } }