千家信息网

使用Sleuth怎么在线程之间传递信息

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,使用Sleuth怎么在线程之间传递信息,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。public class LazyTraceExec
千家信息网最后更新 2025年02月23日使用Sleuth怎么在线程之间传递信息

使用Sleuth怎么在线程之间传递信息,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

public class LazyTraceExecutor implements java.util.concurrent.Executor {    private static final Log log = LogFactory.getLog(MethodHandles.lookup().lookupClass());    private Tracer tracer;    private final BeanFactory beanFactory;    private final Executor delegate;    private TraceKeys traceKeys;    private SpanNamer spanNamer;    public LazyTraceExecutor(BeanFactory beanFactory, Executor delegate) {        this.beanFactory = beanFactory;        this.delegate = delegate;    }    @Override    public void execute(Runnable command) {        if (this.tracer == null) {            try {                this.tracer = this.beanFactory.getBean(Tracer.class);            }            catch (NoSuchBeanDefinitionException e) {                this.delegate.execute(command);                return;            }        }        this.delegate.execute(new SpanContinuingTraceRunnable(this.tracer, traceKeys(), spanNamer(), command));    }}

使用方式

@Configurationpublic class MyConfiguration {    @Autowired    BeanFactory beanFactory;    @Bean    public Executor executor() {        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();        // CUSTOMIZE HERE        executor.setCorePoolSize(7);        executor.setMaxPoolSize(42);        executor.setQueueCapacity(11);        executor.setThreadNamePrefix("MyExecutor-");        // DON'T FORGET TO INITIALIZE        executor.initialize();        return new LazyTraceExecutor(this.beanFactory, executor);    }}

所以它能在线程之间传递traceId并不稀奇,因为它根本就是要你使用它的多线程工具。

4.能否让子线程获取父线程信息呢

4.1 能:InheritableThreadLocal

一般来说,每个线程一个副本,我们都是用ThreaLocal。可是,如果你想要该线程和它的子线程都能读这个副本,那就可以用InheritableThreadLocal了。
用法很简单Demo:

    private static final ThreadLocal sessionInfoHolder1 = new ThreadLocal();    private static final ThreadLocal sessionInfoHolder2 = new InheritableThreadLocal();

看完上述内容,你们掌握使用Sleuth怎么在线程之间传递信息的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

0