因為異步編排的原因,他會丟掉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());