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()));
    
上一篇:C语言题目:5-14 穷举问题-搬砖 (25 分)


下一篇:字节跳动+阿里+华为+腾讯等大厂Java面试题,通用流行框架大全