多线程环境下feign服务调用token失效以及事务管理问题及解决

在批量导入需求优化中,为避免前端请求超时,后端采用多线程异步处理数据校验。然而,多线程导致了token失效问题,通过使用InheritableThreadLocal在子线程中传递token。同时,Spring的事务注解无法在子线程中生效,但TransactionTemplate提供了解决方案,用于手动控制事务,确保多线程环境下的事务一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

最近项目有个批量导入的需求需要优化——当导入数量过大时,后端对导入数据的校验和数据库操作时间过长,会导致前端请求超时,用户体验也极差。所以要将数据校验等耗时操作进行异步处理。此处异步处理采用的是多线程的方式实现,然后就有了以下的问题。

一、多线程服务调用导致token失效

        在多线程开发过程中,主线程的上下文信息默认并不会继承到子线程中,所以需要手动设置,一些特殊的请求头信息(如:token信息),可能无法直接通过上下文获得,此时就需要用到InheritableThreadLocal:可继承的线程级全局变量。

开可在controller层获取请求头信息,并赋值到 InheritableThreadLocal中,此处可以封装一个工具类来操作InheritableThreadLocal。

           将token信息放到共享类中后,需要在Feign配置类中(实现feign.RequestInterceptor)配置服务调用时需要附带的信息,代码示例已给出。至此问题就解决了。

二、多线程开发中事务的优雅处理

        在多线程开发中,Spring自带的事务注解的方式无法对子线程的数据库操作进行回滚。但在Spring提供了手动控制的事务的优雅的结局方案:org.springframework.transaction.support.TransactionTemplate;

此类可以优雅的控制事务提交操作。为方便起见,事务维护的代码已整合到MyService的异步处理中。

<!--Spring手动事务提交jar-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <version>5.3.12</version>
</dependency>

<!--feign  pom-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-feign</artifactId>
  <version>1.4.7.RELEASE</v
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值