在下面的例子中,test2
应该能够从context
和test
访问test1
值,但似乎没有发生这种情况。
欢迎任何见解。
参考文献:
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);
});
我一直在努力使用subscribercontext - 我发现它不是很清楚,当上下文按预期使用时,以及何时没有使用。我希望这有帮助。