最近spring boot项目中由于使用了spring cloud 的hystrix 导致了threadLocal中数据丢失,其实具体也没有使用hystrix,但是显示的把他打开了,导致了此问题。
导致此问题的代码逻辑如下:服务之间的调用采用的feignclient,采用feignclient拦截器获取上游设置到threadlocal中的数据。
@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下文有说明。
但是有时候就拿不到。经过排查,这两边的线程发生了变化,导致取不到值。导致线程发生变化的原因是显示的声明了hystrix为true。
只需要把这个设置成false就好。
但是如果项目中真真的是用了hystrix呢?
引用一下文档进行说明:
和
https://cloud.tencent.com/developer/article/1082737