业务背景:
客户系统下单到我们,我们再调用供应商下单接口办理业务。
客户-->我司-->供应商
问题:
1、供应商提供的接口是异步的,首先调用下单接口,返回是否下单成功(注意:下单成功不代表业务办理成功),下单5秒后再调用供应商的查询接口,查询业务是否办理成功;
2、客户方系统不支持异步处理(不支持我们回调通知他们业务办理结果,也不支持他们主动查询业务办理结果)
解决方案:
V1:调用供应商下单接口成功之后,Thread.sleep(5000),再去调用查询接口,根据查询接口的状态给客户返回,代码如下
//返回结果
JSONObject result = new JSONObject();
Map<String, String> paramMap = Maps.newHashMap();
paramMap.put("mobile", mobile);//订单号
paramMap.put("orderId", orderId);//订单号
paramMap.put("token",token);
List<Map<String, String>> orderResultMapList = InvokeUtil.getInstance().call("order", paramMap);
if(!Collections3.isEmpty(orderResultMapList)){
if("0".equals(orderResultMapList.get(0).get("resultCode"))) {
logger.info("--------下单成功,等待5秒后调用查询接口");
Thread.sleep(5000);
logger.info("--------等待5秒结束,调用查询接口");
Map<String, String> queryParamMap = Maps.newHashMap();
queryParamMap.put("serialNum",orderResultMapList.get(0).get("serialNum"));
queryParamMap.put("token",token);
List<Map<String, String>> queryResultMapList = InvokeUtil.getInstance().call("query", queryParamMap);
if(!Collections3.isEmpty(queryResultMapList)){
if("0".equals(queryResultMapList.get(0).get("resultCode"))) {
if("0".equals(queryResultMapList.get(0).get("orderStatus"))) {
logger.info("--------查询成功,订单状态成功,通知下游办理成功");
//返回下单成功
result.put("retCode","-1");
result.put("retMsg","下单成功");
result.put("orderId",orderId);
return result;
}else{
logger.info("--------查询成功,订单状态失败,通知下游办理失败");
//返回下单失败
result.put("retCode","-1");
result.put("retMsg","下单失败");
return result;
}
}else{
//查询失败,修改订单状态失败
logger.info("--------查询失败,修改订单状态");
requeryOrderStatus();
}
}
}else{
//返回下单失败
result.put("retCode","-1");
result.put("retMsg","下单失败");
return result;
}
}
V1问题:
1、系统主线程等待5秒,占用系统资源
2、下游接口等待时间过久,导致业务流程过长