线程异步丢失上下文问题
因为异步编排的原因,他会丢掉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());