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

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[]{“合同档案导入”});
}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值