记录一下,不太复杂的复杂业务

业务背景:

客户系统下单到我们,我们再调用供应商下单接口办理业务。

客户-->我司-->供应商

问题:

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、下游接口等待时间过久,导致业务流程过长

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值