当前位置: 首页 > news >正文

虚拟电商-话费充值业务(五)充值成功逻辑和网络异常重试逻辑

一、网络异常重试逻辑编写

如果在对接供应商的过程中出现了网络异常,我们需要做一个补偿机制,在任务类型枚举类:TaskTypeEnum中有一种业务状态码是针对远程调用失败的

步骤一:在对接供应商的方法:SupplierServiceImpl类中的recharge方法中,对调用供应商的代码块加上try{}catch{},捕获到异常后,添加重试任务,任务类型枚举为:TaskTypeEnum.REMOTEERROR,业务状态码为:StatusCode.REMOTEERROR

@Override
public void recharge(RechargeRequest rechargeRequest) {
   //.......................前面的代码省略
    
    Result<RechargeResponse> result = null;
    try {
        result = doDispatchSupplier(rechargeRequest);
    } catch (Exception e) {
        log.error("recharge exception ,{}",e.getMessage());
        //添加远程调用重试任务
        rechargeRequest.setErrorCode(StatusCode.REMOTEERROR);
        supplierTask.addRetryTask(rechargeRequest);
        return;
    }
    if(result !=null){
        //判断成功还是失败
        if(result.getCode() == StatusCode.OK){
            log.info("下单成功,等待充值处理回调!");
            //特别注意此时订单状态还不能修改为充值成功-----供应商回调之后才能修改为成功
            updateTrade(rechargeRequest.getOrderNo(),OrderStatusEnum.UNAFFIRM.getCode());//充值处理中等待确认
            return;
        }else {
            //失败就分好几种:余额不足轮转 下单失败重试等
            if(result.getCode() == StatusCode.BALANCE_NOT_ENOUGH){
                //模拟余额不足 轮转--到极速
                /* rechargeRequest.setSupply(Constants.jisuapi);
                rechargeRequest.setRepeat(0);
                rechargeRequest.setErrorCode(StatusCode.BALANCE_NOT_ENOUGH);*/
                //将我们余额不足的供应商放入reids 排除集合中
                cacheService.sAdd(Constants.exclude_supplier,rechargeRequest.getSupply());
                String nextSupply = nextSupply();
                System.out.println("轮转到新的供应商为:"+nextSupply);
                if(nextSupply !=null){
                    rechargeRequest.setSupply(nextSupply);
                    rechargeRequest.setRepeat(0);
                    rechargeRequest.setErrorCode(StatusCode.BALANCE_NOT_ENOUGH);
                }else {
                    //没有供应商了
                    updateTrade(rechargeRequest.getOrderNo(),OrderStatusEnum.FAIL.getCode());
                    return;
                }
            }else if(result.getCode() == StatusCode.ORDER_REQ_FAILED) {
                //重试逻辑的编写---添加重试任务
                rechargeRequest.setErrorCode(StatusCode.ORDER_REQ_FAILED);
            }
            supplierTask.addRetryTask(rechargeRequest);
        }
    }
}

步骤二:在供应商任务接口SupplierTask中添加远程调用异常重试方法:rechargeException

 /**
     * 远程调用异常重试
     */
    public void rechargeException();

步骤三:实现远程调用重试方法

@Override
@Scheduled(fixedRate = 1000)
public void rechargeException() {
    retry(TaskTypeEnum.REMOTEERROR);
}

步骤四:测试:除了chongba_recharge_mock不启动之外,其他都启动,进行话费充值,模拟远程调用失败场景。

二、供应商话费充值成功逻辑编写

对接调用成功后我们需要将订单状态改为处理中,一段时间后供应商会回调我们系统,我们需要做的就是更改订单状态为充值成功。

步骤一:模拟对接极速成功的情况,在SupplierServiceImpl类中的方法doPostJisu(RechargeRequest rechargeRequest)中,模拟极速返回成功

//map.add("req_status", ""+StatusCode.ERROR);
map.add("req_status", ""+StatusCode.OK);

步骤二:对接下单方法: recharge(RechargeRequest rechargeRequest)逻辑修改,添加对接成功的判断,目前都是失败的情况

判断对接返回的Result结果中的业务状态码,如果是成功的就对接订单修改订单状态为处理中,否则就是目前的一些异常逻辑

@Override
public void recharge(RechargeRequest rechargeRequest) {
    //.................前面的省略
     Result<RechargeResponse> result = null;
    try {
        result = doDispatchSupplier(rechargeRequest);
    } catch (Exception e) {
        log.error("recharge exception ,{}",e.getMessage());
        //添加远程调用重试任务
        rechargeRequest.setErrorCode(StatusCode.REMOTEERROR);
        supplierTask.addRetryTask(rechargeRequest);
        return;
    }
    if(result !=null){
        //判断成功还是失败
        if(result.getCode() == StatusCode.OK){
            log.info("下单成功,等待充值处理回调!");
            //特别注意此时订单状态还不能修改为充值成功-----供应商回调之后才能修改为成功
            updateTrade(rechargeRequest.getOrderNo(),OrderStatusEnum.UNAFFIRM.getCode());//充值处理中等待确认
            return;
        }else {
            //失败就分好几种:余额不足轮转 下单失败重试等
            if(result.getCode() == StatusCode.BALANCE_NOT_ENOUGH){
                //模拟余额不足 轮转--到极速
                /* rechargeRequest.setSupply(Constants.jisuapi);
                rechargeRequest.setRepeat(0);
                rechargeRequest.setErrorCode(StatusCode.BALANCE_NOT_ENOUGH);*/
                //将我们余额不足的供应商放入reids 排除集合中
                cacheService.sAdd(Constants.exclude_supplier,rechargeRequest.getSupply());
                String nextSupply = nextSupply();
                System.out.println("轮转到新的供应商为:"+nextSupply);
                if(nextSupply !=null){
                    rechargeRequest.setSupply(nextSupply);
                    rechargeRequest.setRepeat(0);
                    rechargeRequest.setErrorCode(StatusCode.BALANCE_NOT_ENOUGH);
                }else {
                    //没有供应商了
                    updateTrade(rechargeRequest.getOrderNo(),OrderStatusEnum.FAIL.getCode());
                    return;
                }
            }else if(result.getCode() == StatusCode.ORDER_REQ_FAILED) {
                //重试逻辑的编写---添加重试任务
                rechargeRequest.setErrorCode(StatusCode.ORDER_REQ_FAILED);
            }
            supplierTask.addRetryTask(rechargeRequest);
        }
    }
}

步骤三:成功后极速平台会进行一个回调,在chongba_recharge_mock模块中的MockJisuRechargeController中的add方法,回调充吧系统,回调方法在该模块下的BaseController中:rechargeNotify

实际业务中是充吧系统在供应商平台进行配置,回调地址为:
notify-url: http://127.0.0.1:99/order/notify

需要在chongba_recharge_supplier模块的RechargeNotifyController类中补全接收回调的方法,在实际业务中是调用订单的服务处理订单状态。

@Autowired
protected OrderTradeMapper orderTradeMapper;@RequestMapping(value = "/order/notify")
public String notify(@RequestBody String result) {
    JSONObject jsonObject = (JSONObject) JSON.parse(result);
    String orderNo= (String) jsonObject.get("orderNo");
    int status= Integer.parseInt(jsonObject.get("status").toString());
    log.info("充值回调成功修改订单{}的状态为{}",orderNo,status);
    updateTrade(orderNo, status);
    return "sucess";
}private void updateTrade(String  orderNo, int orderStatus) {
    //修改订单状态
    QueryWrapper<OrderTrade> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("order_no", orderNo);
    OrderTrade orderTrade = orderTradeMapper.selectOne(queryWrapper);
    if(orderTrade!=null) {
        orderTrade.setOrderStatus(orderStatus);
        orderTradeMapper.update(orderTrade, queryWrapper);
    }
}

步骤四:测试

启动所有工程,进行话费充值业务,充值成功后进入订单列表,查看订单状态,因为目前的逻辑是供应商5秒后回调我们系统,所以5秒后刷新一下订单列表页面,查看订单状态已改变。

http://www.dtcms.com/a/109768.html

相关文章:

  • Spring Boot 集成Redis 的Lua脚本详解
  • HCIP-12 中间系统到中间系统基础
  • 深度学习与神经网络 | 邱锡鹏 | 第三章学习笔记
  • 根据源码分析vue中nextTick的实现原理
  • makefile , CFALGS 与 EXTRA CFLAGS
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(九)
  • 奇数和偶数的求法c++
  • MINIQMT学习课程Day2
  • 驱动开发硬核特训 · Day 1
  • 【4】搭建k8s集群系列(二进制部署)之安装master节点服务(kube-apiserver)
  • 使用 JavaScript 动态设置 CSS 样式
  • 09_TPL
  • 优质SD-WAN设备厂商推荐:Ogcloud
  • 选择网上购物系统要看几方面?
  • 7-4 BCD解密
  • 零基础玩转树莓派5!从系统安装到使用VNC远程控制树莓派桌面实战
  • [机器学习]随手记
  • NVM 多版本Node.js 管理全指南(Windows系统)
  • TP-Link TL-WR720N v3改造成无线打印伺服器
  • 【力扣hot100题】(048)二叉树的最近公共祖先
  • 硬件负载均衡:让服务像“牛顿钟”一样稳!
  • 如何重构前端项目
  • 深入解析Java哈希表:从理论到实践
  • Qt进阶开发:QDirModel的使用
  • 基于S函数的simulink仿真
  • 4.2-3 fiddler抓取手机接口
  • 【C语言入门】由浅入深学习指针 【第二期】
  • Sora结构猜测
  • TypeScript 元数据操作 API 及示例
  • Unity HDRP管线用ShaderGraph还原Lit,方便做拓展;