微服务架构下,通过feign进行服务间的调用。但是某些场景下,为了用户体验,及时响应,某些耗时的附加操作需要开启异步任务来调用,但是在这种异步调用方式下,可能会存在上下文丢失的情况。
解决方案:
-
将主方法的上下文作为参数传入
- 主方法
/** * 导入数据 * * @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); }
- 手动设置上下文(在feign调用前加上这行代码)
//补全请求上下文 RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(new MockHttpServletRequest()));