В следующем примере test2 должен иметь доступ к значениям context из test и test1, но похоже, что этого не происходит.
Любое понимание приветствуется.
Рекомендации:
https://simonbasle.github.io/2018/02/contextual-logging-with-reactor-context-and-mdc/.
import reactor.core.publisher.Mono;
public class Test {
public static void main(final String[] args) {
System.out.println(Thread.currentThread().getName()
+ " main "
+ test());
}
public static String test() {
final String key = "message";
return test1().subscriberContext(ctx -> ctx.put(key, "test")).block();
}
public static Mono<String> test1() {
final String key = "message1";
return test2().subscriberContext(ctx -> ctx.put(key, "test1 "));
}
public static Mono<String> test2() {
return Mono.just("test2").map(item -> {
Mono.subscriberContext().map(context -> {
System.err.println(Thread.currentThread().getName()
+ " test2 "
+ context);
return context;
});
return item;
});
}}
Выход:
main main test2




Похоже, что следующий код работает нормально, но все еще не уверен, почему код в вопросе не работает.
import reactor.core.publisher.Mono;
public class Test {
public static void main(final String[] args) {
System.out.println(Thread.currentThread().getName()
+ " main "
+ test());
}
public static String test() {
final String key = "message";
return test1().subscriberContext(ctx -> ctx.put(key, "test")).block();
}
public static Mono<String> test1() {
final String key = "message1";
return test2().flatMap(item -> {
Mono.subscriberContext().map(context -> {
System.err.println(Thread.currentThread().getName()
+ " test1 "
+ context);
return context;
});
return Mono.just(item);
}).subscriberContext(ctx -> ctx.put(key, "test1 "));
}
public static Mono<String> test2() {
final String key = "message2";
return Mono.subscriberContext().flatMap(context -> {
System.err.println(context);
return Mono.just("test2");
}).subscriberContext(ctx -> ctx.put(key, "test2"));
}
}
Я думаю, вы хотели получить доступ к контексту подписчика в test2 (), верно? Это работает, только если вы действительно находитесь в одном потоке, поэтому этот фрагмент исправит исходный код: Оригинал:
public static Mono<String> test2() {
return Mono.just("test2").map(item -> {
// you're creating a new Mono context here, and don't return it/use it anymore
Mono.subscriberContext().map(context -> {
System.err.println(Thread.currentThread().getName()
+ " test2 "
+ context);
return context;
});
return item;
});
Исправлено (с минимальным количеством изменений, можно было бы улучшить):
public static Mono<String> test2() {
return Mono.just("test2").flatMap(item -> { // changed map to flatmap, otherwise would be Mono<Mono<String>> here
Mono<Context> contextMono = Mono.subscriberContext()
.map(context -> {
System.err.println(Thread.currentThread()
.getName() + " test2 " + context);
return context;
});
// let item be returned from "inside" of context Mono
return contextMono.map(context -> item);
});
Я постоянно борюсь с контекстом подписчика - мне не очень понятно, когда контекст использовался по назначению, а когда нет. Надеюсь, это поможет.