温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-06-18 18:19:05 来源:亿速云 阅读:422 作者:Leah 栏目:大数据

使用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));
    }
}

使用方式

@Configuration
public 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<String> sessionInfoHolder1 = new ThreadLocal<String>();
    private static final ThreadLocal<String> sessionInfoHolder2 = new InheritableThreadLocal<String>();

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI