天天看點

feign遠端調用丢失頭,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);
           

繼續閱讀