解決Feign配置RequestContextHolder.getRequestAttributes()為null的問題
場景
feign配置如下
異步代碼中調(diào)用feign
當用在異步代碼中用feign調(diào)用微服務(wù)時,后臺日志中出現(xiàn)報錯信息NullPoinntException
分析原因
關(guān)于RequestContextHolder
實現(xiàn)原理 ThreadLocal
ThreadLocal是一個本地線程副本變量工具類。主要用于將私有線程和該線程存放的副本對象做一個映射,各個線程之間的變量互不干擾,在高并發(fā)場景下,可以實現(xiàn)無狀態(tài)的調(diào)用,特別適用于各個線程依賴不同的變量值完成操作的場景。
在每個線程的內(nèi)部存在一個數(shù)據(jù)結(jié)構(gòu)為Map的ThreadLocals變量,以<ThreadLocal,Value>的形式保存著線程變量和其對應(yīng)的值。
對于不同的線程,每次獲取副本值時,別的線程并不能獲取到當前線程的副本值,形成了副本的隔離,互不干擾。
原因
RequestContextHolder將當前線程中的request信息存儲在ThreadLocal中,開啟另外一個線程異步調(diào)用feign,httpRequest是綁定在ThreadLocal中的,只能在當前線程中共享,子線程是不能獲取到父線程的屬性。
解決方案
1、取消異步調(diào)用,改為同步調(diào)用
2、沿用異步調(diào)用,但是在調(diào)用前,把父線程request信息綁定給子線程,在方法執(zhí)行的前面,加入以下語句
下面展示一些 內(nèi)聯(lián)代碼片。
RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JAVA對象JSON數(shù)據(jù)互相轉(zhuǎn)換的四種常見情況
這篇文章主要介紹了JAVA對象JSON數(shù)據(jù)互相轉(zhuǎn)換的四種常見情況,需要的朋友可以參考下2014-04-04MyBatis SpringMVC整合實現(xiàn)步驟詳解
這篇文章主要介紹了MyBatis SpringMVC整合實現(xiàn)步驟詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08使用Java代碼將IP地址轉(zhuǎn)換為int類型的方法
這篇文章主要介紹了使用Java代碼將IP地址轉(zhuǎn)換為int類型的方法,這也是各大計算機考試和ACM以及面試的常見基礎(chǔ)問題,需要的朋友可以參考下2015-08-08springboot實現(xiàn)公眾號接收回復(fù)消息和超過5秒被動回復(fù)消息
本文主要介紹了springboot實現(xiàn)公眾號接收回復(fù)消息和超過5秒被動回復(fù)消息,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05Spring中@Async注解執(zhí)行異步任務(wù)的方法
在業(yè)務(wù)處理中,有些業(yè)務(wù)使用異步的方式更為合理,這篇文章主要介紹了Spring中@Async注解執(zhí)行異步任務(wù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06SpringBoot 改造成https訪問的實現(xiàn)
這篇文章主要介紹了SpringBoot 改造成https訪問的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10