Spring boot +DeferredResult 实现异步接口以及轮询调用
public static ExecutorService FIXED_THREAD_POOL = Executors.newFixedThreadPool(30);
private final Map<String, String> responseMap = new HashMap<>(16);
异步接口:
调用一次,返回对应的id,通过id调用轮询接口,查询状态
@PostMapping("/importHistoricalContract")
@ApiOperation(“合同档案导入”)
public DeferredResult<Response> importHistoricalContract(@RequestParam(value = “file”, required = false) MultipartFile file,
@RequestParam String contractId,
@RequestParam String menuId) {
DeferredResult<Response> response = new DeferredResult<>(10000L);
String id = UuidUtils.generateUuid().replace("-", “”);
HtContractArchives htContractArchives = htContractArchivesService.getHtContractArchivesById(contractId);
Map<String, Object> map = htContractArchivesService.getHtContractArchivesExportMap(htContractArchives, false);
Map<String, String> linkMap = (LinkedHashMap<String, String>) map.get(“code”);
List headList = (List) map.get(“head”);
List<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[]{“合同档案导入”});
}
}