feign遠端呼叫丟失頭,Feign非同步情況丟失上下文問題
阿新 • • 發佈:2021-02-05
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);