谷粒商城实战笔记-问题记录-Feign异步调用丢失请求头问题

news2024/9/22 7:24:03

文章目录

  • 单线程下生效的原理
  • 多线程下Interceptor不生效的原因
  • 解决方案
    • 1,不优雅的方法
    • 2,优雅的方法

在请求多个信息时,我们使用了多线程,这就带来了一个问题,前面我们解决Feign丢失请求头的方案在多线程下,不再有效,丢失请求头的问题再度出现。

在这里插入图片描述

单线程下生效的原理

  1. 请求处理流程
    在单线程环境下,请求的处理流程是顺序的。当一个请求到达时,它会被控制器(Controller)处理。控制器会调用服务(Service)来处理业务逻辑。在这个过程中,请求相关的数据会被存储在ThreadLocal中。

  2. RequestContextHolder
    RequestContextHolder是一个工具类,它提供了获取当前请求相关数据的方法。在单线程环境下,当一个请求被处理时,RequestContextHolder.getRequestAttributes()会返回当前请求的ServletRequestAttributes。这个ServletRequestAttributes包含了请求相关的数据,包括请求头。

  3. RequestInterceptor
    当Feign客户端发送请求时,RequestInterceptorapply方法会被调用。在这个方法中,通过RequestContextHolder.getRequestAttributes()获取当前请求的ServletRequestAttributes,然后将请求头添加到新的请求中。由于在单线程环境下,请求的处理是顺序的,因此RequestInterceptor能够正确地获取到请求头,并将其添加到新的请求中。

多线程下Interceptor不生效的原因

  1. 多线程环境
    在多线程环境下,每个线程都有自己的请求上下文。当一个线程处理请求时,它会将请求相关的数据存储在ThreadLocal中。然而,当这个线程处理完请求后,它会释放这些数据,以便其他线程可以使用ThreadLocal来存储自己的请求数据。

  2. RequestContextHolder
    在多线程环境下,当一个线程处理完请求后,它会释放ThreadLocal中的请求数据。这意味着,当另一个线程处理请求时,它不会访问到前一个线程的请求数据,包括请求头。因此,即使使用了RequestInterceptor,多线程下还是会丢失header头。

  3. Controller和Service是否在同一线程
    在多线程环境下,控制器(Controller)和服务(Service)可能不在同一个线程中。当控制器处理请求时,它会将请求相关的数据存储在ThreadLocal中。然而,当控制器调用服务来处理业务逻辑时,这个请求数据可能会被释放,以便其他线程可以使用ThreadLocal来存储自己的请求数据。因此,即使服务在同一个线程中,它也可能无法访问到控制器的请求数据,包括请求头。

通过以上分析,单线程下生效的原理在于请求的处理是顺序的,RequestInterceptor能够正确地获取到请求头,并将其添加到新的请求中。而多线程下Interceptor不生效的原因在于ThreadLocal的作用域和多线程环境,以及控制器和服务可能不在同一个线程中。

解决方案

1,不优雅的方法

在创建线程的之前把ThreadLocal中内容取出,然后设置到子线程的ThreadLocal中。

在这里插入图片描述
但这样做会侵入业务代码,且每使用一个线程就要写这样一段代码,还会导致大量冗余代码。

2,优雅的方法

创建一个抽象类,实现Runnable方法。

public abstract class MyRunnable implements Runnable{
    private RequestAttributes requestAttributes;

    public MyRunnable() {
        requestAttributes = RequestContextHolder.getRequestAttributes();
    }

    public abstract void myRun();

    @Override
    public void run() {
        //每一个线程都来共享之前的请求数据
        RequestContextHolder.setRequestAttributes(requestAttributes);
        myRun();
    }
}

用法如下:
在这里插入图片描述
使用第二种方法,巧妙地把设置对象的工作放在了创建线程对象的构造过程中。

//开启第一个异步任务
        CompletableFuture<Void> addressFuture2 = CompletableFuture.runAsync(new MyRunnable() {
            @Override
            public void myRun() {
                //1、远程查询所有的收获地址列表
                List<MemberAddressVo> address = memberFeignService.getAddress(memberResponseVo.getId());
                confirmVo.setMemberAddressVos(address);
            }
        }, threadPoolExecutor);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2097424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

笔记本连wifi蓝屏问题修复

最近笔记win11专业版本连wifi时总是蓝屏重启&#xff0c;各种杀毒软件升级补丁都无效&#xff0c;最后升级了网卡驱动&#xff0c;就正常了 下载链接&#xff1a; 23.40.0.4无线网卡驱动 下载后直接运行&#xff0c;运行后网卡驱动版本变成 23.40.0.4 就好了&#xff01;&am…

Spring理论知识(Ⅲ)——Spring面向切面编程

Spring的组成 Spring由20个核心依赖组成&#xff0c;这20个核心依赖可以分为6个核心模块 本文主要讲解spring的AOP模块&#xff0c;其中包括spring-aop&#xff0c;spring-aspects Spring AOP模块概述 AOP思想 Spring AOP全面详解(超级详细) AOP 是一种编程思想&…

华为云低代码AstroZero技巧教学3:智能计算商品费用,轻松实现高效数据处理

公司经营过程中&#xff0c;多个场景会涉及到计算商品花费。以企业内部行政采购为例&#xff0c;在统计相关采购清单中&#xff0c;会涉及到诸多数据统计及计算。如采购商品种类、数量、单价以及其他附加成本&#xff08;运输费用&#xff0c;装卸费用&#xff0c;包装费用&…

网络安全ctf比赛/学习资源整理,解题工具、比赛时间、解题思路、实战靶场、学习路线,推荐收藏!

前言 对于想学习或者参加CTF比赛的朋友来说&#xff0c;CTF工具、练习靶场必不可少&#xff0c;今天给大家分享自己收藏的CTF资源&#xff0c;希望能对各位有所帮助。 CTF在线工具 首先给大家推荐我自己常用的3个CTF在线工具网站&#xff0c;内容齐全&#xff0c;收藏备用。…

第11章 第9节 基于软件质量特性的测试(软件评测师)

1.以下关于软件质量特性测试的叙述&#xff0c;正确的是&#xff08;&#xff09; 1.成熟性测试是检验软件系统故障&#xff0c;或违反指定接口的情况下维持规定的性能水平有关的测试工作 &#xff08;&#xff0c;成熟性测试是检验软件产品是否具备为避免由软件中错误而导致…

平价蓝牙耳机哪个音质好性价比高?四大超值平价机型推荐

在当今市场上&#xff0c;蓝牙耳机的选择众多&#xff0c;从高端品牌到平价型号&#xff0c;消费者面对的选择可谓是五花八门&#xff0c;并非每个人都愿意或能够负担得起昂贵的价格以获取顶级音质&#xff0c;所以平价蓝牙耳机哪个音质好性价比高&#xff1f;对于那些寻求性价…

springboot党员之家服务系统小程序论文源码调试讲解

第二章技术介绍 2.1B/S结构 随着软件系统的不断改进和升级&#xff0c;B/S结构产品更为方便的特征体现地十分明显。对于一个中等偏大的公司来说&#xff0c;如果系统管理员每天要在很多台电脑之间来回查看&#xff0c;不断奔走&#xff0c;那么效率和工作量就会变得很低&#…

服务器数据恢复—如何应对双循环RAID5阵列的数据丢失问题?

服务器存储数据恢复环境&#xff1a; 一台存储中有一组由7块硬盘组建的RAID5阵列&#xff0c;存储中还有另外3块盘是raid中掉线的硬盘&#xff08;硬盘掉线了&#xff0c;管理员只是添加一块的新的硬盘做rebuild&#xff0c;并没有将掉线的硬盘拔掉&#xff09;。整个RAID5阵列…

大模型全攻略:数据准备、模型微调到部署,一文全解析!

0. 引言 距离ChatGPT已经发布1年半了&#xff0c;距离我们训练出自己的大模型也已经1周年了。目前仍然有很多同学在咨询如何训练自己的大模型。这个东西和男/女朋友一样。当你不认识TA&#xff0c;距离TA很远&#xff0c;不敢接触TA的时候&#xff0c;TA就是很神秘&#xff0c…

基础闯关4

环境配置 我们来配置LlamaIndex实验环境&#xff0c;首先创建Python环境并安装必要的库&#xff1a; conda create -n llamaindex python3.10 conda activate llamaindex conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.7 -c pytorch -c nvid…

通配符SSL证书自动续签自动部署方案

支持一对一答疑的购买网址 最开始接触 https 的时候一直是使用的 阿里云和腾讯云的免费 SSL证书&#xff0c;免费的SSL证书用了几年后&#xff0c;慢慢的部署https证书的项目越来越多&#xff0c;时间久了发现每个网站都需要一个 SSL证书&#xff0c;每个SSL证书都需要单独申请…

Unity 性能优化工具收集

本文地址&#xff1a;https://blog.csdn.net/t163361/article/details/141809415 Unity原始工具 UPR 官方 UPR UPR桌面端解决方案&#xff0c;减轻测试设备性能压力&#xff0c;使测试过程更加顺畅。提供CLI用于自动化测试系统对接。 PerformanceBenchmarkReporter Unity 性…

电动汽车行业智能充电桩语音提示IC方案

随着电动车市场的日益壮大&#xff0c;共享汽车也纷纷采用电动车这类新能源&#xff0c;预示着充电桩市场将迎来巨大的发展潜力。智能充电桩&#xff0c;其功能与加油站的加油机颇为相似&#xff0c;可灵活安装于公共建筑如商场、停车场以及居民小区内&#xff0c;为用户提供便…

IP SSL证书——为IP升级加密

在数字化浪潮中&#xff0c;每一份数据传输都承载着重要信息与价值。当您的业务跨越国界&#xff0c;触及全球用户时&#xff0c;确保通信安全、提升品牌信任度&#xff0c;成为了不可或缺的一环。IP SSL证书&#xff0c;作为网络安全的守护者&#xff0c;正以其独特的优势&…

前端怎么实现大模型对话

说一下前端怎么实现大模型&#xff0c;就是像什么通义千问文心一言GPT那样的&#xff0c;这个我之前做过啊就是这样的&#xff0c;这是我们以前在公司做的&#xff0c;对大家以后开发这种东西有一些参考&#xff0c;那我们当时做的时候是没有参考的&#xff0c;网上有这种相关的…

BITCN合集(BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM、BITCN-BILSTM、BITCN-SVM)

BITCN合集&#xff08;BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM、BITCN-BILSTM、BITCN-SVM&#xff09; BITCN合集&#xff08;BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM等&#xff09;代码获取戳此处代码获取戳此处代码获取戳此处 BITCN&#xff08;双向时间卷积神经网…

深入了解Pod(二)

一、StatefulSet 1、StatefulSet介绍 StatefulSet是用于在Kubernetes集群中管理有状态应用的一种资源对象&#xff0c;比如Mysql、MongoDB等。有状态应用是指依赖持久性存储并且在集群重启后仍然保持状态的应用。StatefulSet可以确保有状态应用在集群中的唯一性和稳定性。 Sta…

英特尔或将计划剥离资产削减成本

KlipC报道&#xff1a;有消息称&#xff0c;英特尔正在计划剥离不必要的的业务和调整资本支出以重振公司&#xff0c;其中包括出售可编程芯片部门Altera在内的业务来削减总体成本。其现在正在与投资银行高盛集团和摩根士丹利合作&#xff0c;讨论各种方案。 据KlipC了解&#…

LabVIEW水泵机组监控系统

介绍了一种基于LabVIEW的水泵机组智能监控系统。该系统结合先进的传感器和数据采集技术&#xff0c;实时监控水泵机组的运行状态&#xff0c;有效预防故障&#xff0c;提高运行效率。通过LabVIEW平台的集成开发环境&#xff0c;系统实现了高效的数据处理和友好的用户界面。 项…

线上报名链接怎么做_零基础小白也能做

在这个日新月异的数字时代&#xff0c;每一次点击都可能是通往新世界的钥匙。今天&#xff0c;我们诚挚地向您发出邀请&#xff0c;通过这独一无二的线上报名链接&#xff0c;不仅简化繁琐的报名流程&#xff0c;更让您轻松跨越现实的界限&#xff0c;踏入一场精心策划的盛宴或…