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

Fegin异步情况丢失上下文问题

在微服务的开发中,我们经常需要服务之间的调用,并且为了提高效率使用异步的方式进行服务之间的调用,在这种异步的调用情况下会有一个严重的问题,丢失上文下

通过以上图片可以看出异步丢失上下文的原因是不在同一个线程,所有数据不能共享,Wie了解决这个问题,我们就需要把之前线程的请求头上下文,在次存放到其他线程的请求头上下文就行,具体实现如下:

 

案例:feign异步获取订单明细的案例代码

/*** 获取订单明细的vo* @return*/@Overridepublic OrderConfirmVo orderConfirm() {MemberResponseVo member = OrderInterceptor.threadLocal.get();OrderConfirmVo orderConfirmVo = new OrderConfirmVo();System.out.println("主线程:"+ Thread.currentThread().getId());//获取主线程的请求头信息RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();//考虑到效率问题  使用异步编排CompletableFuture<Void> getAddress = CompletableFuture.runAsync(() -> {//子线程中设置添加主线程的请求头信息  信息共享  否则远程调用异步处理丢失请求头信息RequestContextHolder.setRequestAttributes(requestAttributes);System.out.println("address:"+ Thread.currentThread().getId());//远程获取地址信息List<MemberAddressVo> address = memberFeignService.getAddress(member.getId());orderConfirmVo.setAddress(address);}, executor);CompletableFuture<Void> getItem = CompletableFuture.runAsync(() -> {//子线程中设置添加主线程的请求头信息  信息共享  否则远程调用异步处理丢失请求头信息RequestContextHolder.setRequestAttributes(requestAttributes);System.out.println("item:"+ Thread.currentThread().getId());//远程获取购物项List<OrderItemVo> currentUserCartItems = cartFeignService.getCurrentUserCartItems();orderConfirmVo.setItems(currentUserCartItems);}, executor).thenRunAsync(()->{List<OrderItemVo> items = orderConfirmVo.getItems();//获取所有商品的idList<String> collect = items.stream().map(item -> item.getSkuId()).collect(Collectors.toList());List<Long> skuIds = collect.stream().map(item -> {return Long.parseLong(item);}).collect(Collectors.toList());R<List<SkuHasStockVo>> skusHasStock = wmsFeignService.getSkusHasStock(skuIds);List<SkuHasStockVo> data = skusHasStock.getData(new TypeReference<List<SkuHasStockVo>>() {});if(data!= null){Map<Long, Boolean> collect1 = data.stream().collect(Collectors.toMap(SkuHasStockVo::getSkuId, SkuHasStockVo::getHasStock));orderConfirmVo.setStocks(collect1);}},executor);//异步编排完成之后执行后续操作try {CompletableFuture.allOf(getAddress,getItem).get();} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}orderConfirmVo.setIntegration(member.getIntegration());orderConfirmVo.setPayPrice(orderConfirmVo.getPayPrice());orderConfirmVo.setTotal(orderConfirmVo.getTotal());//TODO 放重处理  生成token令牌储存在redisString token = UUID.randomUUID().toString().replace("-", "");orderConfirmVo.setOrderToken(token);redisTemplate.opsForValue().set(OrderConstant.ORDER_TOKEN+member.getId(),token);return orderConfirmVo;}

 

http://www.lryc.cn/news/138377.html

相关文章:

  • 《Linux从练气到飞升》No.17 进程创建
  • python + pyside2,pyside6,运行错误
  • 第60步 深度学习图像识别:误判病例分析(Pytorch)
  • 基于Java+SpringBoot+vue前后端分离夕阳红公寓管理系统设计实现
  • 远控木马病毒分析
  • 线性代数的学习和整理7:各种特殊效果矩阵汇总
  • [git]github上传大文件
  • element ui - el-select获取点击项的整个对象item
  • 实现SSM简易商城项目的购物车实现
  • 【学习FreeRTOS】第17章——FreeRTOS任务通知
  • GO-vscode远程开发和调试
  • 【笔记】判断两个Double类型的值是否相同
  • Linux —— nfs文件系统
  • 数据降维 | MATLAB实现T-SNE降维特征可视化
  • 蓝桥杯上岸每日N题 (交换瓶子)
  • GMS基本模块TIN、Solids、Modflow2000/2005、MT3DMS、MODPATH。及其在地下水流动、溶质运移、粒子追踪方面的应用
  • MySQL数据库中间件Mycat介绍及下载安装(教程)
  • 【VMware】CentOS 设置静态IP(Windows 宿主机)
  • 机器学习十大算法之七——随机森林
  • spring boot 3使用 elasticsearch 提供搜索建议
  • 住宅IP:解锁更快速、稳定的互联网,你准备好了吗?
  • 支持dolby vision的盒子接支持dolby vision的电视,在adaptive hdr时,播放非dv的hdr视频,输出sdr
  • 使用ffmpeg将WebM文件转换为MP4文件的简单应用程序
  • Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务”
  • 玩转Mysql系列 - 第6篇:select查询基础篇
  • 【SpringCloud技术专题】「Gateway网关系列」(1)微服务网关服务的Gateway组件的原理介绍分析
  • 【面试刷题】————STL中的vector是如何实现的?
  • 使用钉钉的扫码会出现多个回调(DTFrameLogin)
  • Android | 关于 OOM 的那些事儿
  • 珠玑妙算游戏