开发中碰到类似受理业务等相关接口一般都是异步获取结果,要么就属于异步回调后再下一步处理业务,要么就定时轮询查询接口获取结果再下一步处理业务流程;此次碰到类似接口是没有异步回调处理,协同系统只提供业务受理接口及查询结果接口,不明确什么时间会有处理完成结果,仅给大概1分钟时间,只好使用轮询的方式查询结果 ;通过ExecutorService、Callable、Future实现有返回结果的多线程来轮询结果判断是否再下一步业务。
相关代码片段:
public Map<String, Object> queryRetry(PayOrder payOrder) {
final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
// 总共轮询查询时间,单位秒
final int queryTime = 60;
// 间隔时间,单位秒
final int queryPeriod = 5;
// 使用ExecutorService、Callable、Future实现有返回结果的多线程。
Callable<Object> queryCallable = () -> {
Thread.sleep(queryPeriod * 1000);
return this.orderInfoQuery(payOrder);
};
//返回map
Map<String, Object> map = Maps.newHashMap();
int n = queryTime / queryPeriod;
for (int i = 0; i <= n; i++) {
Future<Object> future = service.submit(queryCallable);
try {
//获取map结果
map = (Map<String, Object>)future.get();
log.info(i + "次轮询查询返参>>" + map);
//code 编码为0成功
if ("0".equals(map.get("code"))) {
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 停止线程池
service.shutdownNow();
return map;
}