其他分享
首页 > 其他分享> > feign异步调用丢失上下文

feign异步调用丢失上下文

作者:互联网

微服务架构下,通过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()));
    

标签:异步,feign,调用,requestAttributes,param,上下文,customerId
来源: https://blog.csdn.net/V_A_L/article/details/119273843