線程異步丟失上下文問題


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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM