我有一个带有方法context()的PublishContext类,如下所示:
public static Mono<Object> context(){
return Mono.empty().subscriberContext( context -> {
Context context1 = context.put("key", "hello");
System.out.println((String) context1.get("key"));
return context1;
});
}
在上面的代码中,上下文对象是Context0 @ 744,上下文对象是Context @ 747,这是可以理解的,因为上下文是不可变的,并且始终返回新的上下文。
在我的主班里,我有以下代码:
public static void main(String[] args) {
Mono<Object> objectMono = PublishContext.context();
objectMono.subscribe();
Mono<Object> objectMono1 = Mono.subscriberContext().flatMap(context -> {
System.out.println((String) context.get("key"));
return Mono.empty();
});
objectMono1.subscribe();
}
在这里,我得到的上下文为Context0 @ 744,即旧上下文,因此,出现“上下文为空”异常。有人可以解释一下这种行为吗?另外,如何访问我从context()方法返回的context0 @ 747?
答案 0 :(得分:1)
Context
写入必须属于以下内容的同一链:
运算符因此,这是一个“自包含”序列,其中您具有源(Mono.empty()
,Context
写(.subscriberContext(...)
)和最后一个订阅步骤({{1 }})没什么意义。
也许尝试将objectMono.subscribe()
变成修饰方法?
context()
然后申请并阅读:
public static <T> Mono<T> addContext(Mono<T> source){
return source.subscriberContext( context -> {
Context context1 = context.put("key", "Hello");
System.out.println((String) context1.get("key"));
return context1;
});
}
此打印(前提是主打印机不会太早退出):
public static void main(String[] args) {
Mono<String> mono = Mono.just("foo")
.flatMap(value -> Mono.subscriberContext()
.map(ctx -> value + context.getOrDefault("key", "UNKNOWN"))
);
Mono<String> monoWithCtxWrite = addContext(mono);
mono.subscribe(System.out::println)
monoWithCtxWrite.subscribe(System.out::println);
}