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