Spring webflux 中的 flatMap() 与 subscribe()

flatMap() vs subscribe() in Spring webflux

我是 Spring WebFlux 的新手,正在尝试将我的 spring MVC 应用程序转换为 webflux。我 return 来自我的服务的 Mono mono :

    List<Store> stores = new ArrayList();

当我这样做时:

    mono.subscribe(stores::addAll);
    dataexchange.put("stores", stores);
    return Mono.just(dataexchange);

然后 stores 被填充为空列表作为响应。但是,我可以在 returning 响应后验证 subscribe() 是否正常工作。

当我这样做时:

    return mono.flatmap( (response) -> {
        dataexchange.put("stores", response));
        return Mono.just(dataexchange);
    });

然后在响应中填充商店。

谁能解释一下这两者有什么区别? flatMap 阻塞了吗? 提前致谢!

mono.subscribe(stores::addAll);

是异步的。这意味着,您告诉单声道它现在可以 开始 评估。

您要做的是立即继续处理 stores - 很有可能 Mono 尚未评估。

那么,如何解决这个问题?

您可以阻止直到Mono完成:

mono.doOnNext(stores::addAll).block()

当然,这违背了响应式编程的目的。您将阻塞主线程直到一个动作完成,这可以在没有 Reactor 的情况下以更简单的方式实现。


正确的方法是将其余代码从头到脚更改为响应式。这类似于您的第二个示例,您对 dataexchange 的调用是 Mono 的一部分,因此也被异步评估。

要吸取的重要教训是像 mapflatMap 这样的操作不是对 Mono 的结果进行操作,而是创建一个新的 Mono将另一个转换添加到原始 Mono 的执行中。只要 Mono 不计算,flatMapmap 操作实际上就没有做任何事情。


希望对您有所帮助。