1. 程式人生 >實用技巧 >其它 >feign遠端呼叫丟失頭,Feign非同步情況丟失上下文問題

feign遠端呼叫丟失頭,Feign非同步情況丟失上下文問題


技術標籤:java學習筆記多執行緒feign

1、feign遠端呼叫丟失頭


feign遠端呼叫丟失頭,Feign非同步情況丟失上下文問題

解決:設定feign的求情攔截器

@Configuration
public class MyFeignConfig {
    @Bean("requestInterceptor")
    public RequestInterceptor requestInterceptor(){
        RequestInterceptor requestInterceptor = requestTemplate -> {
            //RequestContextHolder拿到剛進來的請求
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            if (requestAttributes!=null){
                HttpServletRequest request = requestAttributes.getRequest();
                if(request!=null){
                    //同步請求頭資料,cookie
                    requestTemplate.header("Cookie",request.getHeader("Cookie"));
                }
            }
        };
        return requestInterceptor;
    }
}

feign遠端呼叫丟失頭,Feign非同步情況丟失上下文問題

2、Feign非同步情況丟失上下文問題

由於feigb請求攔截器為新的request設定請求頭底層是使用ThreadLocal儲存剛進來的請求,所以在非同步情況下,其他執行緒並不能獲取到主執行緒的ThreadLocal,所以也拿不到請求。

解決:先獲取主執行緒的ThreadLocal儲存的請求資料,再分別向其他執行緒中設定

        //拿到主執行緒請求,放到各個非同步任務中
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();//

        CompletableFuture<Void> addrFuture = CompletableFuture.runAsync(() -> {
           //設定到其他執行緒
            RequestContextHolder.setRequestAttributes(requestAttributes);
            //遠端呼叫查地址
            List<MemberReceiveAddressVo> address = memberFeignService.getAddress(memberVo.getId());
            orderConfirmVo.setAddressVos(address);
        }, threadPoolExecutor);