初始代码
CompletableFuture<Void> addressFuture = CompletableFuture.runAsync(() -> {
//1、远程查询所有的收获地址列表
List<MemberAddressVo> address = memberFeignService.getAddress(memberResponseVo.getId());
confirmVo.setMemberAddressVos(address);
}, threadPoolExecutor);
问题
发现使用异步之后,又获取不到原始请求域中的数据了
解决
发现是因为异步,执行代码的线程已经不是同一个线程了,因此这里需要给子线程中获取主线程的请求数据
修改后代码
//TODO :获取当前线程请求头信息(解决Feign异步调用丢失请求头问题)
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
//开启第一个异步任务
CompletableFuture<Void> addressFuture = CompletableFuture.runAsync(() -> {
//每一个线程都来共享之前的请求数据
RequestContextHolder.setRequestAttributes(requestAttributes);
//1、远程查询所有的收获地址列表
List<MemberAddressVo> address = memberFeignService.getAddress(memberResponseVo.getId());
confirmVo.setMemberAddressVos(address);
}, threadPoolExecutor);
值得注意的是,RequestContextHolder是由ThreadLocal来实现的,因此在不同的线程中就是不同的RequestContextHolder