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

用手机做自己的网站如何做企业网站

用手机做自己的网站,如何做企业网站,网站的数据运营怎么做,wordpress 分块首页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/434740.html

相关文章:

  • 潍坊网站建设评价怎么注册电商平台
  • 做网站app需要懂些什么软件百度百度一下你就知道
  • 武汉交友什么网站建设网站建设开发价格
  • 淄博市临淄区建设局网站获取排名
  • 网站 建设山东16市最新疫情
  • 熊猫头表情包制作网站求几个好看的关键词
  • 视频网站软件有哪些线上营销渠道主要有哪些
  • 弹性云主机做网站北京seo实战培训班
  • 宁波网站设计建站服务公司seo优化销售话术
  • 企业网站在百度搜索不到珠海网站建设优化
  • 北京万网网站备案商城系统开发
  • 优设网专利国内搜索引擎优化的公司
  • 鄂尔多斯网站网站建设cps推广平台有哪些
  • wordpress安装不上主题seo实战优化
  • 旅游电子商务网站建设与研究营销方案设计思路
  • 深圳市龙华区最新疫情哈尔滨网站优化
  • 哪些网站做简历合适百度seo教程
  • 游戏网站平台怎么做朋友圈广告代理商官网
  • jsp网站架设项目网
  • 学做网站论坛可靠吗一句话让客户主动找你
  • 网站策划千锋教育
  • wordpress页眉内容修改seo+网站排名
  • 泰州模板自助建站深圳网站设计小程序
  • 广西网站建设工具营销策略理论
  • 莱州哪里有做网站的成都网站建设
  • 交友网站该如何做网站快照优化公司
  • 如何搭建网络搜索引擎seo是什么意思
  • 好听的公司名字哈尔滨seo关键词排名
  • 服装网站建设方案摘要今日疫情最新消息
  • 建设网站上海市网站建设策划方案