线程异步丢失上下文问题
因为异步编排的原因,他会丢掉ThreadLocal中原来线程的数据,从而获取不到loginUser,这种情况下我们可以在方法内的局部变量中先保存原来线程的信息,在异步编排的新线程中拿着局部变量的值重新设置到新线程中即可。
由于RequestContextHolder使用ThreadLocal共享数据,所以在开启异步时获取不到老请求的信息,自然也就无法共享cookie了

在这种情况下,我们需要在开启异步的时候将老请求的RequestContextHolder的数据设置进去
OrderServiceImpl.confirmOrder()代码
// 从主线程获取用户数据 放到局部变量中
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
CompletableFuture<Void> getAddressFuture = CompletableFuture.runAsync(() -> {
// 把旧RequestAttributes放到新线程的RequestContextHolder中
RequestContextHolder.setRequestAttributes(attributes);
// 远程查询所有的收获地址列表
List<MemberAddressVo> address;
try {
address = memberFeignService.getAddress(MemberRespVo.getId());

浙公网安备 33010602011771号