我的应用程序处理上游请求调用 2 个下游系统(通过 REST)。由于调用是可并行的,我想使用虚拟线程,通过
StructuredTaskScope.fork()
或 Executors.newVirtualThreadPerTaskExecutor()
不幸的是,
traceId
不会自动向下游传播,并且虚拟线程中不存在MDC。
经过研究,这似乎是已知问题,没有简单的解决方案。
我想问我是否可以期望 Spring Boot 将来在跟踪和 MDC 传播到虚拟线程方面提供支持,或者我必须自己管理它
为了将MDC和traceId传递给VT,我创建了以下虚拟线程工厂
class MdcAndTraceVirtualThreadFactory implements ThreadFactory {
private static final ObservationRegistry OBSERVATION_REGISTRY = ObservationRegistry.create();
@Override
public Thread newThread(Runnable r) {
Map<String, String> ctx = MDC.getCopyOfContextMap();
Observation observation = OBSERVATION_REGISTRY.getCurrentObservation();
return Thread.ofVirtual().factory().newThread(() -> {
MDC.setContextMap(ctx);
observation.observe(r);
});
}
}
然后我可以将工厂传递给
StructuredTaskScope
或 Executors.newThreadPerTaskExecutor
并拥有 MDC 和跟踪感知虚拟线程