首页 > 其他分享 >traceId实现

traceId实现

时间:2023-03-29 12:00:51浏览次数:60  
标签:Runnable 实现 Callable ThreadLocal traceId 线程 Tracer

普通

内部拦截器,threadlocal变量set上下文context。

父子线程传递

InheritableThreadLocal Thread内部为InheritableThreadLocal开辟了一个单独的ThreadLocalMap。在父线程创建一个子线程的时候,会检查这个ThreadLocalMap是否为空,不为空则会浅拷贝给子线程的ThreadLocalMap。

线程池场景传递

Transmittable ThreadLocal,有个专门的TtlRunnable和TtlCallable包装类,用于读取原Thread的ThreadLocal对象及值并存于Runnable/Callable中,在执行run或者call方法的时候再将存于Runnable/Callable中的ThreadLocal对象和值读取出来,存入调用run或者call的线程中。
public void testAsync() {
    ExecutorService ttlExecutorService = TtlExecutors.getTtlExecutorService(executorService);
    String traceId = Tracer.startServer(); //父线程的traceId
    ThreadLocal<String> traceContext = new TransmittableThreadLocal<>(); 
    traceContext.set(traceId); //存入TransmittableThreadLocal
    ttlExecutorService.submit(new Runnable() {
        @Override
        public void run() {
            //runnable执行中获取当前线程的traceId与父线程的traceId一致
            String childTraceId = traceContext.get();
            Assert.assertEquals(childTraceId, traceId);
            Tracer.startClient(traceId);
            Tracer.endClient();
        }
    });
    Tracer.endServer();
}
考虑到代码入侵,可以通过-javaagent:/xx/transmittable-thread-local.jar启动,对原生类进行字节码增强。提交的java.lang.Runnable类型的任务会被包装为TtlRunnable,提交的java.util.concurrent.Callable类型的任务会被包装为TtlCallable,实现了无入侵无感知地嵌入TTL的功能。 TtlExecutorTransformlet处理的类:ThreadPoolExecutor及其子类、ScheduledThreadPoolExecutor。 TtlForkJoinTransformlet处理的类:ForkJoinTask、ForkJoinPool 默认开启。 TtlTimerTaskTransformlet处理的类:仅处理TimeTask子类。

标签:Runnable,实现,Callable,ThreadLocal,traceId,线程,Tracer
From: https://www.cnblogs.com/zhengbiyu/p/17268399.html

相关文章

  • 【bat批处理脚本命令】bat脚本命令的基本使用(保姆级图文+实现代码)
    bat批处理脚本的基本使用(图文并茂)bat脚本命令的注释bat脚本命令的换行bat脚本命令的if判断1.bat脚本命令的注释作为高端程序员,不写注释不是好习惯,先学如何写注释写......
  • 循环队列(顺序)的实现:舞伴问题
    一、问题引入舞伴配对问题:假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头各出一人配成舞伴。若两队初始人数不相同,则较长的......
  • rust对T和&T实现trait意义
    如果T实现了某个trait,那么整个T类型的&T,也实现了该trait了吗?不是这样的。为什么这样,例子说明下:traitSpeaker{fnspeak(&self);}structBasicSpeaker;implSpe......
  • 使用原生input实现单选按钮组
    typeRadioType={bottomHeight?:number;name:string;label:string;dirNameList:string[];required?:boolean;onChange?:(value:string)=>vo......
  • 10大协作办公工具:实现团队工作效率最大化
    近年来移动互联网的迅速发展以及越来越多的创业公司把他们数据迁移到云服务器上,创业从此不必再拘泥于固定的办公地点,在家办公、异地办公、移动办公等远程办公模式已经逐渐......
  • 光伏电池PV建模,基于Boost Buck电路实现最大功率追踪MPPT
    光伏电池PV建模,基于BoostBuck电路实现最大功率追踪MPPT,包括扰动观察法,电导增量法,改进型电导增量法,滑模变结构法等控制算法,模型仿真效果较好,适合借鉴学习。图片为模型图,功......
  • 如何实现一个单例?
    构造函数需要private访问权限,这样避免外部通过new创建实例;考虑对象创建时的线程安全问题考虑是否支持延迟加载考虑getInstance性能是否高(是否加锁)1、饿汉式:点......
  • 代码雨类库的实现
    代码雨类库的实现电影黑客帝国有个代码雨效果--挺酷的,我在网上看到了使用js写的代码雨的代码,我把由函数实现的代码,改为使用类实现代码雨特效。一、设计一个简单美化的......
  • 实战演示k8s部署go服务,实现滚动更新、重新创建、蓝绿部署、金丝雀发布
    1前言本文主要实战演示k8s部署go服务,实现滚动更新、重新创建、蓝绿部署、金丝雀发布2go服务镜像准备2.1初始化项目cd/Users/flying/Dev/Go/go-lesson/src/mkdirgoPubl......
  • 实现公众号关注或取关后再处理我们自己的业务逻辑
    大家好,我是小悟在做微信小程序或公众号开发的有时候,难免会遇到需要在用户关注或取关公众号后处理业务逻辑的需求,只需要几步就可以搞定。1、配置首先我们需要在微信公众号后......