2021SC@SDUSC
rabbitmq同步传输的使用
rabbitmq同步传输
配置rabbitmq同步传输
@Bean
AsyncRabbitTemplate asyncRabbitTemplate(RabbitTemplate rabbitTemplate){
return new AsyncRabbitTemplate(rabbitTemplate);
}
同步请求设置
首先注入Templete
@Autowired
private AsyncRabbitTemplate asyncRabbitTemplate;
同步请求传输
-
首先判断入参合法性
//不存在对应题目直接返回 if (!problemMapper.exists(solve.getProblemId())) { return null; }
-
进行参数转换以及数据库入参出参查询校验
ProblemLimit problemLimit = problemLimitMapper.getProblemLimitById(solve.getProblemId()); ImmediateMessage immediateMessage = new ImmediateMessage(); immediateMessage.setInput(customInput); JudgeMessage.Code code = new JudgeMessage.Code(solve.getLanguage(), solve.getCode()); immediateMessage.setCode(code); JudgeMessage.JudgeLimit judgeLimit = new JudgeMessage.JudgeLimit(); if (problemLimit == null) { judgeLimit.setMaxCPUTime(2000); judgeLimit.setMaxMemory(null); judgeLimit.setMaxRealTime(5000); } else { judgeLimit.setMaxMemory(problemLimit.getMemoryMax()); judgeLimit.setMaxRealTime(problemLimit.getTimeMax()); } immediateMessage.setJudgeLimit(judgeLimit);
-
对象序列化处理以及检验
String json = JSON.toJSONString(immediateMessage); System.out.println(json);
-
同步传输以及校验处理
String jsonString = future.get(); ImmediateReplay replay = JSON.parseObject(jsonString, ImmediateReplay.class); SolveTestPoint solveTestPoint = new SolveTestPoint(); solveTestPoint.setDetailOfError(Objects.toString(replay.getDetailOfError())); solveTestPoint.setResult(replay.getStdOut()); if (replay.getRunningDetails() != null) { solveTestPoint.setMemory(replay.getRunningDetails().getMemory()); solveTestPoint.setTime(replay.getRunningDetails().getTime()); } return solveTestPoint;
通过
String jsonString = future.get();
获取到同步校验一个的测试点的检验时间不会超过10s中,用同步传输以及同步回调,可以减轻异步处理服务器的压力