虛擬電商-話費充值業務(五)充值成功邏輯和網絡異常重試邏輯

一、網絡異常重試邏輯編寫

如果在對接供應商的過程中出現了網絡異常,我們需要做一個補償機制,在任務類型枚舉類: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.pswp.cn/bicheng/75558.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75558.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75558.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零構建大語言模型全棧開發指南:第四部分:工程實踐與部署-4.3.3低代碼開發:快速構建行業應用(電商推薦與金融風控案例)

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 從零構建大語言模型全棧開發指南-第四部分:工程實踐與部署4.3.3 低代碼開發:快速構建行業應用(電商推薦與金融風控案例)1. 低代碼與AI結合的核心價值2. 電商推薦系統案例2.1 技術架構與實現2.2 性能…

Table as Thought論文精讀

標題&#xff1a;Table as Thought: Exploring Structured Thoughts in LLM Reasoning 作者&#xff1a;Zhenjie Sun, Naihao Deng, Haofei Yu, Jiaxuan You 單位&#xff1a;University of Illinois Urbana-Champaign, University of Michigan 摘要&#xff1a; llm的推理…

ubuntu18 server版花屏問題

新搞了一臺dellT150的塔式服務器&#xff0c;裝的ubuntu18 server版。 開機后遇到花屏&#xff0c;或者卡在開機界面的問題&#xff0c;和售后技術溝通這個情況是ubuntu自帶的顯卡驅動包兼容問題。需要做如下設置&#xff1a; 解決&#xff1a; 1.開機&#xff0c;連續按下e…

【MySQL】理解MySQL的雙重緩沖機制:Buffer Pool與Redo Log的協同之道

在數據庫系統中&#xff0c;內存與磁盤的讀寫性能差距始終是需要解決的核心問題。當注意到Redo Log和Buffer Pool都采用"先寫內存再刷盤"的設計時&#xff0c;一個自然的問題浮現&#xff1a;既然兩者都需要維護內存數據并定期持久化&#xff0c;為何需要雙重緩沖機制…

PMP考試改革解讀:新題型+5A通關秘籍

2024年&#xff0c;項目管理協會&#xff08;PMI&#xff09;對PMP考試進行了重大調整&#xff0c;從考試形式、題型分布到知識領域均進行了優化升級。本文結合PMI官方公告與一線教研經驗&#xff0c;深度解析改革要點&#xff0c;并提供針對性通關策略&#xff0c;助你高效沖刺…

【Django】教程-10-ajax請求Demo,結合使用

【Django】教程-1-安裝創建項目目錄結構介紹 【Django】教程-2-前端-目錄結構介紹 【Django】教程-3-數據庫相關介紹 【Django】教程-4-一個增刪改查的Demo 【Django】教程-5-ModelForm增刪改查規則校驗【正則鉤子函數】 【Django】教程-6-搜索框-條件查詢前后端 【Django】教程…

RabbitMQ高級特性1

RabbitMQ高級特性1 一.消息確認1.消息確認機制2.手動確認代碼肯定確認否定確認1否定確認2Spring中的代碼 二.持久性1.交換機持久化2.隊列的持久化3.消息的持久化非持久化代碼實現三方面都持久化&#xff0c;數據也會丟失 三.發送方確認1.Confirm確認模式2.return返回模式 四.總…

Java網絡編程NIO

一、NIO是什么? NIO可以說是比BIO更強大的IO&#xff0c;可以設置非阻塞模式&#xff08;通過事件的方式監聽數據的到來&#xff09; BIO是基于socket通信&#xff0c;一個線程對應一個socket連接&#xff0c;讀取數據要一直等待 NIO是基于channel通信&#xff0c;一個線程管…

【動態規劃】二分優化最長上升子序列

最長上升子序列 II 題解 題目傳送門&#xff1a;AcWing 896. 最長上升子序列 II 一、題目描述 給定一個長度為 N 的數列&#xff0c;求數值嚴格單調遞增的子序列的長度最長是多少。 輸入格式&#xff1a; 第一行包含整數 N第二行包含 N 個整數&#xff0c;表示完整序列 輸…

Dify接口api對接,流式接收流式返回(.net)

試了好多種方法除了Console.WriteLine()能打印出來&#xff0c;試了好些方法都不行&#xff0c;不是報錯就是打印只有一行&#xff0c;要么就是接收完才返回...下面代碼實現調用api接收流式數據&#xff0c;并進行流式返回給前端&#xff1a; using Furion.HttpRemote; using …

19-元素顯示模式及浮動(CSS3)

知識目標 掌握標準文檔流的解析規則掌握元素的顯示模式掌握元素浮動屬性語法與使用掌握浮動塌陷解決方法 1. 標準文檔流 2. 元素顯示模式 元素顯示模式就是元素&#xff08;標簽&#xff09;以什么方式進行顯示&#xff0c;比如<div>獨占一行&#xff0c;一行可以放多…

HTML jQuery 項目 PDF 批注插件庫在線版 API 示例教程

本文章介紹 HTML && jQuery Web項目中 PDF 批注插件庫 ElasticPDF 在線版 API 示例教程&#xff0c;API 包含 ① 導出批注后PDF數據&#xff1b;② 導出純批注 json 數據&#xff1b;③ 加載舊批注&#xff1b;④ 切換文檔&#xff1b;⑤ 切換用戶&#xff1b;⑥ 清空批…

CATIA裝配體全自動存儲解決方案開發實戰——基于遞歸算法的產品結構樹批量處理技術

一、功能定位與技術架構 本工具針對CATIA V5裝配體文件管理場景&#xff0c;實現了一套全自動遞歸存儲系統&#xff0c;主要功能包括&#xff1a; ?智能路徑選擇&#xff1a;通過Tkinter目錄對話框實現可視化路徑選擇?產品結構遞歸解析&#xff1a;深度優先遍歷裝配體中的子…

C#:接口(interface)

目錄 接口的核心是什么&#xff1f; 1. 什么是接口&#xff08;Interface&#xff09;&#xff0c;為什么要用它&#xff1f; 2. 如何定義和使用接口&#xff1f; 3.什么是引用接口&#xff1f; 如何“引用接口”&#xff1f; “引用接口”的關鍵點 4. 接口與抽象類的區…

基于卷積神經網絡CNN實現電力負荷多變量時序預測(PyTorch版)

前言 系列專欄:【深度學習:算法項目實戰】?? 涉及醫療健康、財經金融、商業零售、食品飲料、運動健身、交通運輸、環境科學、社交媒體以及文本和圖像處理等諸多領域,討論了各種復雜的深度神經網絡思想,如卷積神經網絡、循環神經網絡、生成對抗網絡、門控循環單元、長短期記…

關于inode,dentry結合軟鏈接及硬鏈接的實驗

一、背景 在之前的博客 缺頁異常導致的iowait打印出相關文件的絕對路徑-CSDN博客 里 2.2.3 一節里&#xff0c;我們講到了file&#xff0c;fd&#xff0c;inode&#xff0c;dentry&#xff0c;super_block這幾個概念&#xff0c;在這篇博客里&#xff0c;我們針對inode和dentr…

游戲引擎學習第201天

倉庫:https://gitee.com/mrxiao_com/2d_game_5 回顧之前的內容&#xff0c;并遇到了一次一階異常&#xff08;First-Chance Exception&#xff09;。 歡迎來到新一期的開發過程&#xff0c;我們目前正在編寫調試接口代碼。 當前&#xff0c;我們已經在布局系統上進行了一些工…

計算機視覺算法實戰——基于YOLOv8的行人流量統計系統

?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連? ??? ????????? ?? 引言:智能客流分析的市場需求 在零售、交通、安防等領域,準確的行人流量統計對于商業決策、公共安全管理…

Redis是什么?架構是怎么樣的?

目錄 前言 一,Redis架構 1.1 本地緩存 1.2 遠程緩存 二,強大的Redis優點 2.1 支持多種數據類型 2.2 內存過期策略 2.3 內存淘汰策略 2.4 持久化 三,Redis是什么 前言 我是一個程序員,維護了一個商品服務,它的背后直連Mysql數據庫,假設商品服務對外每秒需要提供1萬次…

藍橋杯真題——傳送陣

原題連接&#xff1a;藍橋杯2024年第十五屆省賽真題-傳送陣 - C語言網 知識點&#xff1a;并查集 題目描述 小藍在環球旅行時來到了一座古代遺跡&#xff0c;里面并排放置了 n 個傳送陣&#xff0c;進入第 i 個傳送陣會被傳送到第 ai 個傳送陣前&#xff0c;并且可以隨時選擇…