Mono.subscriberContext()返回旧上下文

时间:2019-02-20 06:06:22

标签: java reactive-programming spring-webflux project-reactor

我有一个带有方法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?

1 个答案:

答案 0 :(得分:1)

  • A)Context写入必须属于以下内容的同一链: 运算符
  • B)它必须在所需部分的“下游” 阅读

因此,这是一个“自包含”序列,其中您具有源(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);
}