19-线程上下文传播:异步执行为什么容易丢 Trace

19-线程上下文传播:异步执行为什么容易丢 Trace

核心问题:线程池、定时任务、CompletableFuture 如何影响链路连续性。

先说结论

TraceId 常放在 ThreadLocal 中,但线程切换后 ThreadLocal 不会自动传播。

线程池、定时任务和异步回调都会导致链路上下文丢失。

解决方式通常是在提交任务时捕获上下文,在执行任务时恢复上下文。

这篇文章能带你完成什么

你不用先掌握所有 Java Agent 概念。本篇先让你做出一个能运行的小结果:复制代码、执行命令、看到输出。

跑通以后,再回头看图和源码,你会更容易理解这个机制在 JVM Sandbox 里负责哪一块。整个专栏都按这个节奏来:先做出来,再解释为什么。

先把几个词讲明白

上下文传播

上下文传播指把当前请求的 TraceId 从一个线程带到另一个线程。ThreadLocal 默认不会自动跨线程。

可以怎么理解

它像接力赛传棒:主线程有 TraceId,但新线程不会天然拿到,必须显式传过去。

本篇先抓住什么

这一篇要让你记住两个动作:提交任务时捕获上下文,执行结束后恢复或清理上下文。

如果这些词现在还不能完全理解也没关系。先按下面步骤把代码跑起来,再回头看这一段,会更容易对上。

本篇