gpt4 book ai didi

java - 在 TimeoutMainSubscriber 的情况下将 Reactor Context 复制到 MDC

转载 作者:行者123 更新时间:2023-12-02 08:59:22 27 4
gpt4 key购买 nike

我一直在关注https://github.com/archie-swif/webflux-mdc/blob/master/src/main/java/com/example/webfluxmdc/MdcContextLifter.java处的代码使用钩子(Hook)将数据从 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 lifters 验证 Context 的传播时,onNext() onError()onComplete() 不会在 中调用>TimeoutMainSubscriber(其中 Context 被复制到 MDC),仅调用 currentContext()

Mono 超时的情况下,如何传播上下文并复制到 MDC 以在 doOnErrordoOnEach 中使用?我不想将副本移至 currentContext(),因为此方法被调用多次,在我看来这不是最佳解决方案。

最佳答案

您是否尝试重写 MdcContextLifter 类中的 onError 方法?

    @Override
public void onError(Throwable t) {
copyToMdc(coreSubscriber.currentContext()); // similar to onNext()
coreSubscriber.onError(t);
}

关于java - 在 TimeoutMainSubscriber 的情况下将 Reactor Context 复制到 MDC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60277259/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com