最近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