解決Feign配置RequestContextHolder.getRequestAttributes()為null的問題
場(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è)本地線程副本變量工具類。主要用于將私有線程和該線程存放的副本對(duì)象做一個(gè)映射,各個(gè)線程之間的變量互不干擾,在高并發(fā)場(chǎng)景下,可以實(shí)現(xiàn)無狀態(tài)的調(diào)用,特別適用于各個(gè)線程依賴不同的變量值完成操作的場(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中,開啟另外一個(gè)線程異步調(diào)用feign,httpRequest是綁定在ThreadLocal中的,只能在當(dāng)前線程中共享,子線程是不能獲取到父線程的屬性。
解決方案
1、取消異步調(diào)用,改為同步調(diào)用
2、沿用異步調(diào)用,但是在調(diào)用前,把父線程request信息綁定給子線程,在方法執(zhí)行的前面,加入以下語句
下面展示一些 內(nèi)聯(lián)代碼片。
RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
區(qū)塊鏈常用數(shù)據(jù)庫leveldb用java來實(shí)現(xiàn)常規(guī)操作的方法
這篇文章主要介紹了區(qū)塊鏈常用數(shù)據(jù)庫leveldb用java來實(shí)現(xiàn)常規(guī)操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
github上的java項(xiàng)目怎么運(yùn)行(面向小白)
這篇文章主要介紹了github上的java項(xiàng)目怎么運(yùn)行(面向小白),今天從github把我以前寫的一個(gè)小demo下載下來了,第一次下載項(xiàng)目,摸索了一個(gè)多小時(shí),才運(yùn)行起來,需要的朋友可以參考下2019-06-06
Spring?Boot?基于?CAS?實(shí)現(xiàn)單點(diǎn)登錄的原理、實(shí)踐與優(yōu)化全解析(最新整理)
本文詳解SpringBoot集成CAS單點(diǎn)登錄的原理、實(shí)現(xiàn)步驟及優(yōu)缺點(diǎn),涵蓋CASServer與Client架構(gòu)、票據(jù)機(jī)制、配置方法,并提供優(yōu)化策略如集群部署、緩存加速和用戶體驗(yàn)提升方案,助力企業(yè)實(shí)現(xiàn)統(tǒng)一認(rèn)證與高效管理,感興趣的朋友一起看看吧2025-07-07
SpringBoot+SpringSecurity處理Ajax登錄請(qǐng)求問題(推薦)
這篇文章主要介紹了SpringBoot+SpringSecurity處理Ajax登錄請(qǐng)求問題,本文給大家介紹的非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-12-12

