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

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

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

1、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; } }

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);