介绍
- 在项目中,链路追踪是通过
traceId
去关联的,但当使用多线程的话,会出现不同线程之间traceId
不一致情况,导致无法追踪;
解决方案一
- 以
CompletableFuture
为例,并行请求多个接口,子线程的日志无法通过父线程的traceId追踪,因为traceId
是通过线程的ThreadLocal
进行存储的,只能够在当前线程获取; - 这里使用
Skywalking
的SupplierWrapper.of()
方法解决:
CompletableFuture<List<SysUser>> futureSysUsers = CompletableFuture.supplyAsync(SupplierWrapper.of(() -> {
}), asyncTaskExecutor);
- 依赖
<!--异步链路追踪依赖-->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
</dependency>
解决方案二
- 使用Brave提供的API,使用方法同上
brave.propagation.CurrentTraceContext#wrap(java.lang.Runnable)
brave.propagation.CurrentTraceContext#wrap(java.util.concurrent.Callable)
brave.propagation.CurrentTraceContext#executor
brave.propagation.CurrentTraceContext#executorService