最近spring boot項目中因爲使用了spring cloud 的hystrix 致使了threadLocal中數據丟失,其實具體也沒有使用hystrix,可是顯示的把他打開了,致使了此問題。java
致使此問題的代碼邏輯以下:服務之間的調用採用的feignclient,採用feignclient攔截器獲取上游設置到threadlocal中的數據。spring
@Slf4j public class TenantSupportInterceptor implements RequestInterceptor { public void apply(RequestTemplate template) { String tenantNo = Optional.ofNullable(LocalHolder.getTenantNo()); template.header(CommonConstants.TENANT_NO, tenantNo); } }
public final class LocalHolder { private LocalHolder() { } private static final InheritableThreadLocal<String> TENANT_NO_THREADLOCAL = new InheritableThreadLocal<>(); public static void setTenantNo(String tenantNo) { TENANT_NO_THREADLOCAL.set(tenantNo); } public static String getTenantNo() { return TENANT_NO_THREADLOCAL.get(); } public static void removeTenantNo() { TENANT_NO_THREADLOCAL.remove(); } }
具體爲何採用InheritableThreadLocal下文有說明。app
可是有時候就拿不到。通過排查,這兩邊的線程發生了變化,致使取不到值。致使線程發生變化的緣由是顯示的聲明瞭hystrix爲true。線程
只須要把這個設置成false就好。blog
可是若是項目中真真的是用了hystrix呢?rem
引用一下文檔進行說明:文檔
和it