You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
5.5 KiB

package net.educoder.schedule;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import net.educoder.config.PropertiesConfig;
import net.educoder.model.AutoEvaParamConfig;
import net.educoder.service.AutoEvaParamConfigService;
import net.educoder.util.SignatureUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/**
* @Author: youys
* @Date: 2022/4/2
* @Description: 评测检查告警任务.
*/
@Slf4j
@Component
public class EvaCheckWarningTask {
@Autowired
private PropertiesConfig propertiesConfig;
@Autowired
private AutoEvaParamConfigService autoEvaParamConfigService;
@Value("${bridge.sign.accessKeySecret}")
private String accessKeySecret;
@Async
@Scheduled(cron = "${task.cron.evalCheck}")
public void check() {
log.info("自动化评测接口告警检查---------start ");
long startTime = System.currentTimeMillis();
List<AutoEvaParamConfig> autoEvaParamConfigList = autoEvaParamConfigService.findAll();
log.info("自动化评测接口告警检查,总共有[{}]条需要评测", autoEvaParamConfigList.size());
for (AutoEvaParamConfig autoEvaParamConfig : autoEvaParamConfigList) {
try {
if (autoEvaParamConfig.getType().equals(AutoEvaParamConfig.SX_EVA)) {
String extras = autoEvaParamConfig.getExtras();
if (!StringUtils.hasLength(extras)) {
continue;
}
postEvaluation(autoEvaParamConfig);
} else if (autoEvaParamConfig.getType().equals(AutoEvaParamConfig.OJ_EVA)) {
if (!StringUtils.hasLength(autoEvaParamConfig.getCodeFileContent())) {
continue;
}
postOjEvaluation(autoEvaParamConfig);
}
} catch (Exception e) {
log.error("自动化评测接口告警检查任务异常", e);
}
}
log.info("自动化评测接口告警检查 ---------end ,总耗时:{}ms", (System.currentTimeMillis() - startTime));
}
/**
* 处理实训评测.
*
* @param autoEvaParamConfig 配置
*/
private void postEvaluation(AutoEvaParamConfig autoEvaParamConfig) {
JSONObject extrasObject = JSONObject.parseObject(autoEvaParamConfig.getExtras());
Map<String, Object> param = new HashMap<>(32);
param.put("isPublished", extrasObject.getInteger("isPublished"));
param.put("trimBlank", extrasObject.getInteger("trimBlank"));
param.put("containers", extrasObject.getString("containers"));
param.put("instanceChallenge", extrasObject.getString("instanceChallenge"));
param.put("tpmScript", extrasObject.getString("tpmScript"));
param.put("timeLimit", extrasObject.getInteger("timeLimit"));
param.put("times", extrasObject.getInteger("times"));
param.put("resubmit", extrasObject.getInteger("resubmit"));
param.put("podType", extrasObject.getInteger("podType"));
param.put("content_modified", extrasObject.getInteger("content_modified"));
param.put("tpiID", autoEvaParamConfig.getTpiId());
param.put("testCases", autoEvaParamConfig.getTestCases());
param.put("tpiGitURL", autoEvaParamConfig.getTpiGitUrl());
param.put("buildID", autoEvaParamConfig.getBuildId());
param.put("sec_key", UUID.randomUUID().toString());
param.put("callBackUrl", propertiesConfig.getCallbackUrl());
param.put("ak", RandomUtil.randomString(16));
param.put("nonce", RandomUtil.randomString(16));
String sign = SignatureUtil.genSignature(accessKeySecret, param);
log.info("postEvaluation---------签名值sign:{}", sign);
param.put("sign", sign);
String result = HttpUtil.post(propertiesConfig.getGameEvaluationUrl(), param);
JSONObject jsonResult = JSONObject.parseObject(result);
log.info("实训评测接口返回:{},tpiId:{}", jsonResult, autoEvaParamConfig.getTpiId());
}
/**
* 处理oj评测.
*
* @param autoEvaParamConfig 配置
*/
private void postOjEvaluation(AutoEvaParamConfig autoEvaParamConfig) {
Map<String, Object> param = new HashMap<>(16);
param.put("tpiID", autoEvaParamConfig.getTpiId());
param.put("testCases", autoEvaParamConfig.getTestCases());
param.put("codeFileContent", autoEvaParamConfig.getCodeFileContent());
param.put("sec_key", UUID.randomUUID().toString());
param.put("callBackUrl", propertiesConfig.getCallbackUrl());
param.put("ak", RandomUtil.randomString(16));
param.put("nonce", RandomUtil.randomString(16));
String sign = SignatureUtil.genSignature(accessKeySecret, param);
log.info("postEvaluation---------签名值:{}", sign);
param.put("sign", sign);
String result = HttpUtil.post(propertiesConfig.getOjEvaluationUrl(), param);
JSONObject jsonResult = JSONObject.parseObject(result);
log.info("Oj评测接口返回:{},tpiId:{}", jsonResult, autoEvaParamConfig.getTpiId());
}
}