Mono.subscriberContext() 返回旧上下文
Mono.subscriberContext() returning old context
我有一个 class PublishContext,其方法 context() 如下:
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,context1 是 Context@747,这是可以理解的,因为上下文是不可变的,并且总是 returns 一个新的上下文。
在我的主 class 中,我有以下代码:
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 is empty" 异常。有人可以解释这种行为吗?另外,如何访问我从 context() 方法返回的 context0@747?
- A)
Context
写入需要属于同一个链
运算符
- B) 它需要在你需要的部分的“下游”
阅读
因此,一个“自包含”序列,其中包含源 (Mono.empty()
)、Context
写入 (.subscriberContext(...)
) 以及订阅的最后一步 (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) throws Exception {
Mono<String> mono = Mono.just("foo")
.flatMap(value -> Mono.subscriberContext()
.map(ctx -> value + ctx.getOrDefault("key", "UNKNOWN"))
);
Mono<String> monoWithCtxWrite = addContext(mono);
mono.subscribe(System.out::println);
monoWithCtxWrite.subscribe(System.out::println);
}
这会打印(前提是 main 不会太早退出):
fooUNKNOWN
fooHello
我有一个 class PublishContext,其方法 context() 如下:
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,context1 是 Context@747,这是可以理解的,因为上下文是不可变的,并且总是 returns 一个新的上下文。
在我的主 class 中,我有以下代码:
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 is empty" 异常。有人可以解释这种行为吗?另外,如何访问我从 context() 方法返回的 context0@747?
- A)
Context
写入需要属于同一个链 运算符 - B) 它需要在你需要的部分的“下游” 阅读
因此,一个“自包含”序列,其中包含源 (Mono.empty()
)、Context
写入 (.subscriberContext(...)
) 以及订阅的最后一步 (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) throws Exception {
Mono<String> mono = Mono.just("foo")
.flatMap(value -> Mono.subscriberContext()
.map(ctx -> value + ctx.getOrDefault("key", "UNKNOWN"))
);
Mono<String> monoWithCtxWrite = addContext(mono);
mono.subscribe(System.out::println);
monoWithCtxWrite.subscribe(System.out::println);
}
这会打印(前提是 main 不会太早退出):
fooUNKNOWN
fooHello