当前位置: 首页 > wzjs >正文

c 可以做网站网站入口

c 可以做网站,网站入口,有网站模板怎么做网站,做暧小视频xo免费网站Feign异步模式丢失上下文问题 问题描述 当我们使用异步对我们代码进行操作优化时,代码中使用了RequestContextHolder去获取上下文的数据,当我们执行原来可以执行的业务时发现报了空指针异常或数据为空,这是为什么呢? 原理解释 …

Feign异步模式丢失上下文问题

问题描述

当我们使用异步对我们代码进行操作优化时,代码中使用了RequestContextHolder去获取上下文的数据,当我们执行原来可以执行的业务时发现报了空指针异常或数据为空,这是为什么呢?

image-20250516193327144

原理解释

通过源码我们可以看出来,RequestContextHolder本质的是使用了ThreadLocal作为上下文的实现方式,但ThreadLocal只在自己线程中才可以读取到数据,但我们开启了异步线程,导致数据在不同的线程中为空,那我们怎么解决呢?

image-20250516193412987

解决方法

1、在主线程中读取出主线程的数据,通过RequestContextHolder将数据注入到子线程中即可解决此问题

@Overridepublic OrderConfirmVo confirmOrder() throws ExecutionException, InterruptedException {OrderConfirmVo confirmVo = new OrderConfirmVo();MemberLoginTo memberLoginTo = loginToThreadLocal.get();System.out.println("主线程的id:"+Thread.currentThread().getId());// 主线程的threadLocal数据,注意threadLocal中的数据只是在本线程中生效,若启用异步线程则会出现线程读取不到数据的问题RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();// 1、远程查询所有的收货地址的列表CompletableFuture<Void> addressFuture = CompletableFuture.runAsync(() -> {// 将主线程的threadLocal共享到子线程,避免出现读取不到子线程上下文数据的问题System.out.println("当前线程的id:"+Thread.currentThread().getId());RequestContextHolder.setRequestAttributes(requestAttributes);List<MemberAddressVo> address = memberFeignService.getAddress(memberLoginTo.getId());confirmVo.setAddress(address);}, executor);CompletableFuture<Void> CartItemFuture = CompletableFuture.runAsync(() -> {// 2、远程查询购物车的购物项列表// 将主线程的threadLocal共享到子线程,避免出现读取不到子线程上下文数据的问题System.out.println("当前线程的id:"+Thread.currentThread().getId());RequestContextHolder.setRequestAttributes(requestAttributes);List<OrderItemVo> userCartItems = cartFeignService.getUserCartItems();confirmVo.setOrderItems(userCartItems);// feign 在远程调用之前要构造请求,会调用很多的拦截器}, executor);return confirmVo;}

2、在主线程中使用RequestContextHolder.setRequestAttributes(requestAttributes,true);将主线程的数据共享即可解决此问题

@Overridepublic OrderConfirmVo confirmOrder() throws ExecutionException, InterruptedException {OrderConfirmVo confirmVo = new OrderConfirmVo();MemberLoginTo memberLoginTo = loginToThreadLocal.get();System.out.println("主线程的id:"+Thread.currentThread().getId());// 主线程的threadLocal数据,注意threadLocal中的数据只是在本线程中生效,若启用异步线程则会出现线程读取不到数据的问题RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();// 开启线程数据共享RequestContextHolder.setRequestAttributes(requestAttributes,true);// 1、远程查询所有的收货地址的列表CompletableFuture<Void> addressFuture = CompletableFuture.runAsync(() -> {// 将主线程的threadLocal共享到子线程,避免出现读取不到子线程上下文数据的问题System.out.println("当前线程的id:"+Thread.currentThread().getId());
//            RequestContextHolder.setRequestAttributes(requestAttributes);List<MemberAddressVo> address = memberFeignService.getAddress(memberLoginTo.getId());confirmVo.setAddress(address);}, executor);CompletableFuture<Void> CartItemFuture = CompletableFuture.runAsync(() -> {// 2、远程查询购物车的购物项列表// 将主线程的threadLocal共享到子线程,避免出现读取不到子线程上下文数据的问题System.out.println("当前线程的id:"+Thread.currentThread().getId());
//            RequestContextHolder.setRequestAttributes(requestAttributes);List<OrderItemVo> userCartItems = cartFeignService.getUserCartItems();confirmVo.setOrderItems(userCartItems);// feign 在远程调用之前要构造请求,会调用很多的拦截器}, executor);return confirmVo;}

要构造请求,会调用很多的拦截器
}, executor);
return confirmVo;
}


http://www.dtcms.com/wzjs/397570.html

相关文章:

  • 网站安全维护怎么做免费网页模板网站
  • 重庆工程网站建设郑州网站推广优化
  • 怎么注册公司流程和费用上海优化价格
  • 曰本做爰l网站seo研究院
  • 2017做网站怎么赚钱网站建设黄页免费观看
  • 婚礼网站怎么做的竞价点击软件工具
  • 公司想做一个网站首页怎么做手机网站自助建站系统
  • 做游戏网站国际要闻
  • 做i爱小说网站南宁seo计费管理
  • c2c网站管理系统阿里云官网首页
  • 龙港做网站开展网络营销的企业
  • 怎么查看网页源代码优化大师官方免费
  • 制作网站具体需要什么材料长沙网站排名推广
  • 做美女图片网站犯法吗长沙优化科技
  • 教育网站如何做seo网络推广员一个月多少钱
  • 长沙建网站公司自己建网站怎么建
  • 哪里做网站便宜怎样把自己的产品放到网上销售
  • 北京地铁建设管理公司网站推广引流平台
  • 17网站一起做网店 每日新款汕头seo外包机构
  • 设计师网站源码视频号链接怎么获取
  • 兼职做网站的费用百度手机助手下载安卓版
  • 如何自己设计logo图标手机优化管家
  • 织梦网站关掉wap手机建网站软件
  • 大连网站设计布局浏览器观看b站视频的最佳设置
  • 网站备案 个人互联网营销工具
  • 手机自己做网站网站搭建服务
  • 360网站卖东西怎么做的产品推广运营的公司
  • 网站流量统计怎么做的seo比较好的优化方法
  • 城固县网站建设百度快照首页
  • 企业应如何进行网站建设今日冯站长之家