解决Feign配置RequestContextHolder.getRequestAttributes()为null的问题
场景
feign配置如下

异步代码中调用feign

当用在异步代码中用feign调用微服务时,后台日志中出现报错信息NullPoinntException

分析原因
关于RequestContextHolder
实现原理 ThreadLocal
ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不同的变量值完成操作的场景。
在每个线程的内部存在一个数据结构为Map的ThreadLocals变量,以<ThreadLocal,Value>的形式保存着线程变量和其对应的值。
对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离,互不干扰。
原因
RequestContextHolder将当前线程中的request信息存储在ThreadLocal中,开启另外一个线程异步调用feign,httpRequest是绑定在ThreadLocal中的,只能在当前线程中共享,子线程是不能获取到父线程的属性。
解决方案
1、取消异步调用,改为同步调用
2、沿用异步调用,但是在调用前,把父线程request信息绑定给子线程,在方法执行的前面,加入以下语句
下面展示一些 内联代码片。
RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
区块链常用数据库leveldb用java来实现常规操作的方法
这篇文章主要介绍了区块链常用数据库leveldb用java来实现常规操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-02-02
Spring Boot 基于 CAS 实现单点登录的原理、实践与优化全解析(最新整理)
本文详解SpringBoot集成CAS单点登录的原理、实现步骤及优缺点,涵盖CASServer与Client架构、票据机制、配置方法,并提供优化策略如集群部署、缓存加速和用户体验提升方案,助力企业实现统一认证与高效管理,感兴趣的朋友一起看看吧2025-07-07
SpringBoot+SpringSecurity处理Ajax登录请求问题(推荐)
这篇文章主要介绍了SpringBoot+SpringSecurity处理Ajax登录请求问题,本文给大家介绍的非常不错,具有参考借鉴价值,需要的朋友可以参考下2017-12-12


最新评论