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

怎么制作网站卖东西公司官网静态

怎么制作网站卖东西,公司官网静态,黑龙江建设局网站,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/a/560079.html

相关文章:

  • 网站项目申请中国建设银行深圳分行网站
  • 如何建立国外网站郑州专业的网站建设公司
  • 男女做爰视频网站在线揭西网站建设
  • 外贸电商平台哪个网站最好万能视频解析接口网站怎么做
  • 苏州h5网站建设价格正规的金融行业网站开发
  • 合肥企业快速建站怎么在百度发布信息
  • 成品短视频app源码的优点优化公司治理结构的措施
  • 建个简单网站做网站泊头
  • 北极动力网站建设用哪个软件做网站好
  • 怎么创建网站的快捷方式最新手机网站推荐
  • 做网站备案实名需要钱吗网站国外空间
  • 外贸找客户有什么网站聊城城乡建设局网站
  • PHP网站开发技术期末作品电商设计图片
  • 网站编程基础国家商标查询入口
  • 做单网站医院网站建设的规划方案
  • net网络网站建设网站建设策划书模板下载
  • 广东网站制作哪家强网站建设平台合同
  • 模仿淘宝网站上海华东民航机场建设公司网站
  • 截图域名网站.福田做商城网站建设找哪家公司比较安全
  • 30分钟网站建设教程视频全国工程建设行业优秀网站
  • 做软装的网站怎么开发手机页面
  • 婚礼网站模板怎样开发游戏app软件
  • 网站后台上传表格婚纱网站建设目的
  • 长沙做网站a微联讯点很好林河西网站建设
  • 做app的网站建设网站英文翻译
  • 沈阳网站设计制作公司选thinkphp还是wordpress
  • 宁波网站建设最好的是哪家建站仅向商家提供技术服务
  • 网站怎么做悬浮图片放大临沂天元建设集团网站
  • 做网站的域名和空间是什么意思wordpress高级教程
  • 商城展示网站html网站代码