【发布时间】:2018-08-21 08:30:05
【问题描述】:
我正在尝试实现 Reactor 订阅者上下文 (http://projectreactor.io/docs/core/release/reference/#context),以便我可以将 SLF4J MDC 中的值传递到 Flux 中,然后我可以使用这些值进行日志记录。
我使用subscriberContext() 方法来设置如下值:
someFlux().subscriberContext(Context.of(MDC_ATTRIBUTE, MDC.get(MDC_ATTRIBUTE)));
我还可以访问链中的上下文。以平面地图为例:
.flatMap(r -> Mono.subscriberContext().map(ctx -> {
String name = ctx.getOrDefault(MDC_ATTRIBUTE_NAME, "NO CTX");
return r;
}))
doOnEach() 也有效:
.doOnEach(signal -> {
Context ctx = signal.getContext();
if (signal.isOnNext()) {
try (MDC.MDCCloseable closeable = MDC.putCloseable(MDC_ATTRIBUTE_NAME, ctx.getOrDefault(MDC_ATTRIBUTE_NAME, "MAAAAN"))) {
log.debug("FINISHED: {}", requestName);
}
}
})
只有一个问题。我想在doOnSubscribe、doOnError 和doOnSuccess 中记录一些内容。虽然我可以使用 doOnEach 来检查 signal.isOnNext() 或 signal.isOnComplete(),但我发现从未调用过 signal.isOnSubscribe()。
所以问题是:我怎样才能获得doOnSubscribe() 中的上下文,或者这根本不可能?
【问题讨论】:
-
即使
Flux为空,您是否希望引发订阅事件?
标签: spring-boot project-reactor