java - Mono.subscriberContext() 返回旧上下文

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

我有一个 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,上下文对象是 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?

最佳答案

  • 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);
}

这将打印(假设主程序不会太早退出):

fooUNKNOWN
fooHello

关于java - Mono.subscriberContext() 返回旧上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54779831/

相关文章:

java - Hibernate JPA 在生成 ID 时检查冲突

java - 从 openapi 中的文件上传获取流

java - 在 RxJava 中使用 onErrorReturn 和 retryWhen

rxjs - RX - 如何以高性能的方式使用它?

java - 如何获取当前类的方法名

java - 仅在负轴上法线贴图 "working"

objective-c - Reactive Cocoa 中 RACAble()、RACObserve() 和 RACBind() 的区别

java - Spring React - 发出 zipWith 时出现问题

spring-boot - Spring Webflux 微服务中不支持将 javax.json.JsonPatch 作为 @RequestBody

java - 处理 Spring Web 中的 # 字符