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

c 可以做网站厦门网站到首页排名

c 可以做网站,厦门网站到首页排名,怎么下载建设银行网站,网站首页专题怎么做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/38366.html

相关文章:

  • 网站建设和的注意事项海门网站建设
  • 短租网站那家做的好处优化网站排名费用
  • 上海自制网站建设策划公司一般怎么收费
  • 网站付款链接怎么做的网站建站设计
  • 物流网站建设规划总结seo到底是做什么的
  • 杭州企业做网站响应式网站建设
  • 有网站开发专业吗网站查询工具
  • 网站建设方案下载北京口碑最好的教育机构
  • 厦门网站优化推广域名购买哪个网站好
  • 网站用Access做数据库sem竞价推广是什么意思
  • 南宁自己的网站竞价托管就选微竞价
  • 做彩票网站要什么接口站长统计是什么意思
  • 办文明网站做文明网民活动方案seo主要是指优化
  • 免费软件下载网站海外推广平台有哪些?
  • 站长之家ping百度搜索资源
  • 怎么选择镇江网站建设东莞做网站公司首选
  • wordpress自定义菜单输出seozou是什么意思
  • 做外贸仿牌网站百度推广app怎么收费
  • 手机浏览器下载大全免费下载seo优化软件购买
  • 平谷网站建设鞍山做网站的公司
  • 合肥web网站建设直销怎么做才最快成功
  • 深圳分销网站设计制作电商营销
  • 可靠的广州做手机网站添加友情链接的技巧
  • 威县做网站报价网络营销成功案例ppt
  • 个人网站有哪些站综合权重查询
  • 重庆社区官网seo优化排名技术百度教程
  • 17网站一起做网店浙江西安网络推广公司
  • 做游戏小网站是啥千锋教育培训怎么样
  • 做相关性分析的网站公司推广方案
  • 开发公司物业服务合同济南网站seo优化