欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決Feign配置RequestContextHolder.getRequestAttributes()為null的問(wèn)題

 更新時(shí)間:2024年01月18日 09:33:23   作者:07feng  
這篇文章主要介紹了解決Feign配置RequestContextHolder.getRequestAttributes()為null的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

場(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)文章

最新評(píng)論