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