我是靠谱客的博主 务实白羊,最近开发中收集的这篇文章主要介绍Feign配置RequestContextHolder.getRequestAttributes()为null的解决方案场景分析原因,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Feign配置RequestContextHolder.getRequestAttributes报NullPointException

  • 场景
  • 分析原因
    • 关于RequestContextHolder
    • 原因
    • 解决方案

场景

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);

最后

以上就是务实白羊为你收集整理的Feign配置RequestContextHolder.getRequestAttributes()为null的解决方案场景分析原因的全部内容,希望文章能够帮你解决Feign配置RequestContextHolder.getRequestAttributes()为null的解决方案场景分析原因所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部