Spring boot +DeferredResult 实现异步接口以及轮询调用

Spring boot +DeferredResult 实现异步接口以及轮询调用

public static ExecutorService FIXED_THREAD_POOL = Executors.newFixedThreadPool(30);
private final Map responseMap = new HashMap<>(16);

异步接口:
调用一次,返回对应的id,通过id调用轮询接口,查询状态
@PostMapping("/importHistoricalContract")
@ApiOperation(“合同档案导入”)
public DeferredResult importHistoricalContract(@RequestParam(value = “file”, required = false) MultipartFile file,
@RequestParam String contractId,
@RequestParam String menuId) {
DeferredResult response = new DeferredResult<>(10000L);
String id = UuidUtils.generateUuid().replace("-", “”);
HtContractArchives htContractArchives = htContractArchivesService.getHtContractArchivesById(contractId);
Map map = htContractArchivesService.getHtContractArchivesExportMap(htContractArchives, false);
Map linkMap = (LinkedHashMap) map.get(“code”);
List headList = (List) map.get(“head”);
List valueList = htContractArchivesService.getExcelValueList(file, headList.size());
//处理超时事件 采用委托机制
response.onTimeout(new Runnable() {
@Override
public void run() {
responseMap.put(id, “504”);
}
});
FIXED_THREAD_POOL.execute(new Runnable() {
@Override
public void run() {
try {
String msg = htContractArchivesService.importHistoricalData(contractId, menuId, htContractArchives,
linkMap, valueList);
if (msg == null) {
responseMap.put(id, “200”);
} else {
responseMap.put(id, “500”);
}
} catch (Exception e) {
responseMap.put(id, “500”);
}
}
});
response.setResult(getResponse(id, “上传成功,正在处理”, new Object[]{“合同档案导入”}));
return response;
}

轮询接口:轮询调用,确定异步接口是否成功
通过第一次调用异步接口返回的id,从HashMap中读取对应的状态
@GetMapping(“get”)
public Response settingResult(@RequestParam(value = “desired”, required = false, defaultValue = “成功”) String desired) {
if (responseMap.containsKey(desired)) {
return getResponse(responseMap.get(desired), “处理成功”, new Object[]{“合同档案导入”});
} else {
return getResponse(“100”, “正在处理中”, new Object[]{“合同档案导入”});
}
}

你可能感兴趣的:(DeferredResult,spring,boot,java,spring,cloud,后端,微服务)