代码:
@Autowired
RestTemplate restTemplate;
@Override
public void routingInspection(String taskID) {
//循环请求status接口,当状态为完成时请求url接口
String statusUrl = TASK_EXEC_STATUS_URL + "?taskid=" + taskID;
String resultUrl = TASK_EXEC_RESULT_URL + "?taskid=" + taskID;
RoutingInspectionVO routingInspectionVO = new RoutingInspectionVO();
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
int execCount = 0;//记录执行次数,超过5次停止
@Override
@Transactional
public void run() {
//定时任务执行次数超过5次则停止任务
if(execCount >= 5){
timer.cancel();
return;
}
execCount += 1;
ResponseEntity<String> forEntity = null;
JSONObject body = null;
try {
logger.info("巡检查询状态地址:"+ statusUrl);
forEntity = restTemplate.getForEntity(statusUrl, String.class);//请求自动化执行状态
body = JSONObject.parseObject(forEntity.getBody());
logger.info("巡检查询状态返回报文:"+body);
if (forEntity.getStatusCode().value() == 200){
assert body != null;
JSONObject var = body.getJSONObject("result");
String status = var.getString("status");
if("COMPLETE".equals(status)){
String caseCount = var.getString("caseCount");
String passrate = var.getString("passrate");
routingInspectionVO.setPassrate(passrate);
routingInspectionVO.setCaseCount(caseCount);
routingInspectionVO.setStatus(status);
logger.info("巡检查询url地址:"+ resultUrl);
ResponseEntity<String> reportEntity = null;
JSONObject resultBody = null;
try {
reportEntity = restTemplate.getForEntity(resultUrl, String.class);//请求自动化执行结果
resultBody = JSONObject.parseObject(reportEntity.getBody());
logger.info("巡检查询URL返回报文:"+resultBody);
if (reportEntity.getStatusCode().value() == 200) {
JSONObject result = resultBody.getJSONObject("result");
Object share_url = result.get("share_url");
StringBuilder url = new StringBuilder();
if (share_url instanceof String) {
url.append(result.getString("share_url"));
} else if (share_url instanceof JSONArray) {
JSONArray array = JSONArray.parseArray(share_url.toString());
for (Object o : array) {
url.append(o.toString()).append(",");
}
}
routingInspectionVO.setShare_url(url.toString());
}
//发送事件总线消息:
String data = JSON.toJSONString(routingInspectionVO, SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteDateUseDateFormat);
EventBus build = EventBus.builder()
.specversion("1.0")
.type("routing-inspection")
.source("IQAM")
.subject("MS")
.id(UUID.randomUUID().toString())
.time(ZonedDateTime.now(ZoneOffset.UTC).toString())
.datacontenttype(MediaType.APPLICATION_JSON_VALUE)
.data(data)
.build();
String params = JSON.toJSONString(build, SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteDateUseDateFormat);
logger.info("巡检发布时间总线参数列表:{}", params);
// try {
logger.info("发送巡检的事件总线的地址是:{}",routing_inspection_EB);
ResponseEntity<Object> objectResponseEntity = restTemplate.postForEntity(routing_inspection_EB, params, Object.class);
logger.info("冒烟失败发布事件总线消息返回结果:{}", JSONObject.toJSONString(objectResponseEntity));
// } catch (RestClientException e) {
// throw new RuntimeException(e);
// }
logger.info("------巡检任务查询执行完毕---------任务中止!");
timer.cancel();
} catch (RestClientException e) {
logger.error("巡检查询异常:{}",e.getMessage());
timer.cancel();
}
}
}
} catch (RestClientException e) {
logger.error("巡检查询异常:{}",e.getMessage());
timer.cancel();
}
}
},0,30*1000);//每30秒行一次
}
代码是要在接口被触发后,循环调用查询MS接口的状态,完成以后发送MS的结果至事件总线上:
在使用restTemplate请求的时候报错:
I/O error on POST request for "/share-arch-eventbridge.prd.XXX.local/XXX/22/XXX": null; nested exception is org.apache.http.client.ClientProtocolException
复制出来使用postman请求了这个地址是可以的,直接在页面上请求这个地址也是可以的
找了很久,后来对比了其他发送这个地址地址的地方,发现其他地方在前面添加了http://
我这个直接是域名开始的地址,刚开始隔壁的同事说域名确实可以不加http://
事实证明还是需要加的哈,周一找到了周三,问豆包豆包说是timer的问题,说是再timer里面无法使用restTemplate,改了好几种方式,但其实不是,记录一下