异步线程池上下文丢失:TraceID 在子线程消失?InheritableThreadLocal 或 TransmittableThreadLocal 修复!
做过全链路追踪的同学肯定都遇到过这个问题:主线程设置了 TraceID,异步任务或线程池中新线程里却拿不到这个值,导致日志里 TraceID 断掉了,排查问题时要在一堆没有上下文关联的日志里大海捞针。 我之前就遇到过这样一个案例:一个接口处理耗时 5 秒,排查后发现代码里用了 @Async 注解异步执行数据库操作,但子线程的日志里 TraceID 是空的,问了半天才发现是线程池上下文丢失的问题。 今天我们就来聊聊为什么异步场景下上下文会丢失,以及如何用 InheritableThreadLocal 或 TransmittableThreadLocal 来完美解决这个问题。 线程上下文丢失的真相 1. 为什么异步会丢上下文 问题场景: 主线程: ┌─────────────────────────────────────────────┐ │ Thread-1 │ │ TraceID: abc123 │ │ UserID: 100 │ │ RequestID: req-001 │ └─────────────────────────────────────────────┘ │ │ 提交....