Feign異步模式丟失上下文問題

Feign異步模式丟失上下文問題

問題描述

當我們使用異步對我們代碼進行操作優化時,代碼中使用了RequestContextHolder去獲取上下文的數據,當我們執行原來可以執行的業務時發現報了空指針異常或數據為空,這是為什么呢?

image-20250516193327144

原理解釋

通過源碼我們可以看出來,RequestContextHolder本質的是使用了ThreadLocal作為上下文的實現方式,但ThreadLocal只在自己線程中才可以讀取到數據,但我們開啟了異步線程,導致數據在不同的線程中為空,那我們怎么解決呢?

image-20250516193412987

解決方法

1、在主線程中讀取出主線程的數據,通過RequestContextHolder將數據注入到子線程中即可解決此問題

@Overridepublic OrderConfirmVo confirmOrder() throws ExecutionException, InterruptedException {OrderConfirmVo confirmVo = new OrderConfirmVo();MemberLoginTo memberLoginTo = loginToThreadLocal.get();System.out.println("主線程的id:"+Thread.currentThread().getId());// 主線程的threadLocal數據,注意threadLocal中的數據只是在本線程中生效,若啟用異步線程則會出現線程讀取不到數據的問題RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();// 1、遠程查詢所有的收貨地址的列表CompletableFuture<Void> addressFuture = CompletableFuture.runAsync(() -> {// 將主線程的threadLocal共享到子線程,避免出現讀取不到子線程上下文數據的問題System.out.println("當前線程的id:"+Thread.currentThread().getId());RequestContextHolder.setRequestAttributes(requestAttributes);List<MemberAddressVo> address = memberFeignService.getAddress(memberLoginTo.getId());confirmVo.setAddress(address);}, executor);CompletableFuture<Void> CartItemFuture = CompletableFuture.runAsync(() -> {// 2、遠程查詢購物車的購物項列表// 將主線程的threadLocal共享到子線程,避免出現讀取不到子線程上下文數據的問題System.out.println("當前線程的id:"+Thread.currentThread().getId());RequestContextHolder.setRequestAttributes(requestAttributes);List<OrderItemVo> userCartItems = cartFeignService.getUserCartItems();confirmVo.setOrderItems(userCartItems);// feign 在遠程調用之前要構造請求,會調用很多的攔截器}, executor);return confirmVo;}

2、在主線程中使用RequestContextHolder.setRequestAttributes(requestAttributes,true);將主線程的數據共享即可解決此問題

@Overridepublic OrderConfirmVo confirmOrder() throws ExecutionException, InterruptedException {OrderConfirmVo confirmVo = new OrderConfirmVo();MemberLoginTo memberLoginTo = loginToThreadLocal.get();System.out.println("主線程的id:"+Thread.currentThread().getId());// 主線程的threadLocal數據,注意threadLocal中的數據只是在本線程中生效,若啟用異步線程則會出現線程讀取不到數據的問題RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();// 開啟線程數據共享RequestContextHolder.setRequestAttributes(requestAttributes,true);// 1、遠程查詢所有的收貨地址的列表CompletableFuture<Void> addressFuture = CompletableFuture.runAsync(() -> {// 將主線程的threadLocal共享到子線程,避免出現讀取不到子線程上下文數據的問題System.out.println("當前線程的id:"+Thread.currentThread().getId());
//            RequestContextHolder.setRequestAttributes(requestAttributes);List<MemberAddressVo> address = memberFeignService.getAddress(memberLoginTo.getId());confirmVo.setAddress(address);}, executor);CompletableFuture<Void> CartItemFuture = CompletableFuture.runAsync(() -> {// 2、遠程查詢購物車的購物項列表// 將主線程的threadLocal共享到子線程,避免出現讀取不到子線程上下文數據的問題System.out.println("當前線程的id:"+Thread.currentThread().getId());
//            RequestContextHolder.setRequestAttributes(requestAttributes);List<OrderItemVo> userCartItems = cartFeignService.getUserCartItems();confirmVo.setOrderItems(userCartItems);// feign 在遠程調用之前要構造請求,會調用很多的攔截器}, executor);return confirmVo;}

要構造請求,會調用很多的攔截器
}, executor);
return confirmVo;
}


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80698.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80698.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80698.shtml

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

相關文章

JavaScript作用域和作用域鏈

在JavaScript中&#xff0c;作用域和作用域鏈是理解代碼執行和變量訪問的關鍵概念。它們決定了變量和函數在代碼中的可見性和生命周期。 一、作用域&#xff08;Scope&#xff09; &#xff08;一&#xff09;什么是作用域&#xff1f; 作用域是在運行時代碼中的某些特定部分…

人工智能的“歧視”:“她數據”在算法運行中隱形

縱觀人類的發展史&#xff0c;每一次科技進步都將對性別平等產生深刻影響。尤其是當下&#xff0c;人們對于借助人工智能技術快速發展來彌合性別不平等寄予厚望。 但很多人沒想過&#xff0c;人工智能技術本身是客觀中立、不存在“算法歧視”“性別偏見的嗎&#xff1f; 弗吉…

設備全生命周期管理:從采購到報廢的數字化閉環方案

在當今數字化時代&#xff0c;企業對設備的管理已不再局限于簡單的維護與修理&#xff0c;而是追求從采購到報廢的全生命周期數字化閉環管理。易點易動設備管理系統&#xff0c;正是這一趨勢下的佼佼者&#xff0c;它為企業提供了一套高效便捷的設備管理解決方案。 采購階段&a…

React中useState中更新是同步的還是異步的?

文章目錄 前言一、useState 的基本用法二、useState 的更新機制1. 內部狀態管理2. 狀態初始化3. 狀態更新 三、useState 的更新頻率與異步行為1. 異步更新與批量更新2. 為什么需要異步更新&#xff1f; 四、如何正確處理 useState 的更新1. 使用回調函數形式的更新2. 理解異步更…

FEKO許可證與其他電磁仿真軟件的比較

在電磁仿真領域&#xff0c;眾多軟件工具競相爭艷&#xff0c;而FEKO軟件及其許可證制度在其中獨樹一幟。本文將對比FEKO許可證與其他電磁仿真軟件&#xff0c;突出FEKO在許可證方面的卓越性能與獨特優勢&#xff0c;幫助您做出明智的選擇。 一、許可證成本與價值比較 相較于其…

綠色云計算:數字化轉型與可持續發展的完美融合

目錄 引言 綠色云計算的概念與定義 云計算的環境影響與綠色云計算的重要性 綠色云計算的技術實踐與策略 綠色云計算的案例研究與最佳實踐 綠色云計算的挑戰與限制 綠色云計算的未來趨勢與預測 結論與展望 引言 隨著云計算技術的迅猛發展和廣泛應用&#xff0c;其環境影…

在innovus中如何設置讓信號線打上雙孔

知識星球【芯冰樂】入口 為了讓設計的芯片良率能得到顯著提升,一般在繞線資源允許的情況下,我們會在盡可能多的signal線上打上雙孔,然而在進行某個項目的時候,小編驚訝的發現,在數字的layout上一個雙孔都沒出現,這是為什么呢?今天就讓小編分享一下這次新奇的發現; 經…

DevExpress GridControl 復選列實時獲取選中狀態的解決方案

問題核心分析 用戶在使用 DevExpress GridControl 的復選列時遇到兩個關鍵問題&#xff1a; 1.使用 CellValueChanged 事件需要點擊其他列才會觸發&#xff0c;無法實時響應勾選動作 2.使用 CheckedChanged 事件并調用 PostEditor() 會導致復選框無法選中 這主要是因為 DevExp…

數據一致性校驗算法

數據完整性校驗 在 數據錄入、通信協議&#xff08;CAN、LIN、Ethernet&#xff09; 和 存儲&#xff08;Flash、EEPROM&#xff09; 領域&#xff0c;數據校驗&#xff08;Error Checking&#xff09; 是確保 數據完整性和正確性的關鍵技術 示例&#xff1a;當我們從互聯網上…

101個α因子#9

((0 < ts_min(delta(close, 1), 5)) ? delta(close, 1) : ((ts_max(delta(close, 1), 5) < 0) ? delta(close, 1) : (-1 * delta(close, 1))))worldquant brain平臺上調整后的語法&#xff1a; ((0 < min(close-ts_delay(close, 1), ts_delay(close, 1)-ts_delay(c…

國產視頻轉換LT6211UX:HDMI2.0轉LVDS/MIPI芯片簡介,支持4K60Hz

1. LT6211UX HDMI2.0信號輸入 支持HDMI2.0b, HDMI1.4和DVI1.0 支持HDCP2.2和HDCP1.4 數據速率高達6Gbps 自適應接收機均衡 支持4k60Hz 支持的3D格式&#xff1a; 對于HDMI -> LVDS&#xff1a; 直接3D輸出 2路2D L/R輸出 對于HDMI -> MIPI&#xff1a; 框架包裝&#x…

華三(H3C)IRF堆疊心跳的LACP MAD、BFD MAD和ARP MAD差異

華三&#xff08;H3C&#xff09;IRF堆疊心跳的三種MAD&#xff08;多主檢測&#xff09;機制——LACP MAD、BFD MAD和ARP MAD在實現原理、組網要求及適用場景上存在顯著差異。以下是三者的對比分析&#xff1a; 一、核心區別對比 特性LACP MADBFD MADARP MAD檢測原理擴展LAC…

宿州金博學校開展防震演練:夯實安全根基,守護校園平安

5月13日上午9點30分&#xff0c;金博學校原本寧靜的校園被一陣急促的警報聲打破&#xff0c;一場精心籌備、緊張有序的防震演練正式開啟。本次演練意義重大&#xff0c;旨在強化全體師生的防震減災意識&#xff0c;提高大家在地震突發時的應急反應與自我保護能力。 緊急避險&am…

DAY29 超大力王愛學Python

知識點回顧 類的裝飾器裝飾器思想的進一步理解&#xff1a;外部修改、動態類方法的定義&#xff1a;內部定義和外部定義 作業&#xff1a;復習類和函數的知識點&#xff0c;寫下自己過去29天的學習心得&#xff0c;如對函數和類的理解&#xff0c;對python這門工具的理解等&…

RabbitMQ ④-持久化 || 死信隊列 || 延遲隊列 || 事務

消息確認機制 簡單介紹 RabbitMQ Broker 發送消息給消費者后&#xff0c;消費者處理該消息時可能會發生異常&#xff0c;導致消費失敗。 如果 Broker 在發送消息后就直接刪了&#xff0c;就會導致消息的丟失。 為了保證消息可靠到達消費者并且成功處理了該消息&#xff0c;…

python打卡訓練營打卡記錄day31

知識點回顧 規范的文件命名規范的文件夾管理機器學習項目的拆分編碼格式和類型注解 作業&#xff1a;嘗試針對之前的心臟病項目ipynb&#xff0c;將他按照今天的示例項目整理成規范的形式&#xff0c;思考下哪些部分可以未來復用。 心臟病項目目錄 目錄結構:heart/ ├── conf…

mac .zshrc:1: command not found: 0 解決方案

nano ~/.zshrc 使用自帶的nano命令打開文件&#xff0c;修改后 Ctrl X 然后輸入y 然后回車即可保存成功 一般情況下&#xff0c;不是常用這個命令&#xff0c;除非是遇到有問題的文件&#xff0c;才用&#xff0c; 例如 遇到下面的問題 /Users/xxli/.zshrc:1: command no…

uniapp生成的app,關于跟其他設備通信的支持和限制

以下內容通過AI生成&#xff0c;這里做一下記錄。 藍牙 移動應用&#xff08;App&#xff09;通過藍牙與其他設備通信&#xff0c;是通過分層協作實現的。 一、通信架構分層 應用層&#xff08;App&#xff09; 調用操作系統提供的藍牙API&#xff08;如Android的BluetoothA…

第50天-使用Python+Qt+DeepSeek開發AI運勢測算

1. 環境準備 bash 復制 下載 pip install pyside6 requests python-dotenv 2. 獲取DeepSeek API密鑰 訪問DeepSeek官網注冊賬號 進入控制臺創建API密鑰 在項目根目錄創建.env文件: env 復制 下載 DEEPSEEK_API_KEY=your_api_key_here 3. 創建主應用框架 python 復制…

上位機與Hid設備通信

前置知識 什么是HID&#xff1f; HID&#xff08;Human Interface Device&#xff09;是?直接與人交互的電子設備?&#xff0c;通過標準化協議實現用戶與計算機或其他設備的通信&#xff0c;典型代表包括鍵盤、鼠標、游戲手柄等。? 為什么HID要與qt進行通信&#xff1f; …