feign异步调用丢失上下文

本文探讨了在微服务架构下,如何使用Feign进行服务间调用时,针对耗时操作采用异步任务以提升用户体验。然而,这种异步调用可能导致上下文丢失。解决方案是通过将主方法的上下文作为参数传递到异步方法中,并在Feign调用前手动设置请求上下文,确保上下文的完整传递。这种方法能够有效解决异步调用中的上下文丢失问题,保障服务间的正常通信。
摘要由CSDN通过智能技术生成

微服务架构下,通过feign进行服务间的调用。但是某些场景下,为了用户体验,及时响应,某些耗时的附加操作需要开启异步任务来调用,但是在这种异步调用方式下,可能会存在上下文丢失的情况。
请添加图片描述

解决方案:

  1. 将主方法的上下文作为参数传入

    • 主方法
      /**
         * 导入数据
         *
         * @param file
         * @param customerId
         * @return
         */
        @Override
        public void listImport(MultipartFile file, Long customerId) {  
            //获取主方法上下文
    		RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
            asyncService.importCar(customerId,fileName,requestAttributes);
           }
    
    • 异步方法
        /**
         * 异步任务,导入车辆数据
         * @param vehicleInfoReqs
         * @param customerId
         */
        @Async
        public void importCar( Long customerId, String fileName,RequestAttributes requestAttributes) {
             //将传入的上下文设置进去
            RequestContextHolder.setRequestAttributes(requestAttributes);
            vehicleControllerFeignClient.getVehicleByCarNoList(carNos);
        }
    
    1. 手动设置上下文(在feign调用前加上这行代码)
     //补全请求上下文
    RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(new MockHttpServletRequest()));
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值