在微服务系统中,会使用链路追踪把多方调用连接起来。便于问题的调查。公司项目中是用来skywalking来做链路追踪。
再添加了hystrix 以后,使用 @HystrixCommand 注释的方法,内部的traceId会消失。大概分析了一下,应该是hystrix 启用了另一个线程去做的。traceId又保存在Theadlocal变量中。
添加下面的类,重写wrapCallable方法,在创建callable方法的时候,把threadLocal 的变量copy进去就ok了。
@Component
public class CustomizedHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy {
public CustomizedHystrixConcurrencyStrategy () {
HystrixPlugins.reset();
HystrixPlugins.getInstance().registerConcurrencyStrategy(this);
}
@Override
public <T> Callable<T> wrapCallable(Callable<T> callable) {
Map<String, String> map = MDC.getCopyOfContextMap();
return () -> {
try {
MDC.setContextMap(map);
return callable.call();
} finally {
MDC.clear();
}
};
}
}