我一直遵循https://github.com/archie-swif/webflux-mdc/blob/master/src/main/java/com/example/webfluxmdc/MdcContextLifter.java处的代码,使用钩子将数据从Reactor Context放入MDC。
该解决方案在大多数情况下都可以正常工作,除了Mono
超时并且正在使用TimeoutMainSubscriber
时。
下面是我使用的小测试。
Mono<Integer> integerMono = Mono.just(1)
.doOnEach(logger.addToContext(i -> ImmutableMap.of("index", i)))
.flatMap(___ -> Mono.fromSupplier(() -> {
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
return 0;
}
return 1;
}))
.timeout(Duration.ofMillis(5000), Schedulers.parallel())
.doOnEach(logger.info("testMDCLogging"))
.doOnError(logger.error("testMDCErrorLogging"))
.subscriberContext(logger.initContext());
[通过MDC提升程序验证上下文的传播时,在onNext()
中未调用onError()
onComplete()
和TimeoutMainSubscriber
(将上下文复制到MDC上,仅调用了currentContext()
。
[如何在doOnError
超时的情况下传播上下文并复制到MDC以在doOnEach
和Mono
中使用?我不想将副本移到currentContext()
,因为多次调用此方法,而且我认为这不是最佳解决方案。
您是否尝试覆盖MdcContextLifter类中的onError
方法?
@Override
public void onError(Throwable t) {
copyToMdc(coreSubscriber.currentContext()); // similar to onNext()
coreSubscriber.onError(t);
}