Spring Webflux中的flatMap()与subscribe()

时间:2019-02-12 10:25:57

标签: reactive-programming spring-webflux

我是Spring WebFlux的新手,正在尝试将spring MVC应用程序转换为webflux。我从服务中返回了Mono Mono:

    List<Store> stores = new ArrayList();

当我这样做时:

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

然后将存储存储为空列表作为响应。但是,我可以在返回响应后验证subscribe()是否正常工作。

当我这样做时:

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

然后在响应中填充商店。

有人可以解释一下两者之间的区别吗? flatMap是否受阻? 预先感谢!

1 个答案:

答案 0 :(得分:1)

mono.subscribe(stores::addAll);

是异步的。也就是说,您告诉Mono,它现在可以开始评估。

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

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

您可以阻止,直到Mono完成:

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

当然,这违背了反应式编程的目的。您将阻塞主线程,直到操作完成为止。如果没有Reactor,则可以以一种更简单的方式来实现。


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

要学习的重要教训是,mapflatMap之类的操作不是基于Mono的结果进行操作,而是创建一个新的Mono来添加另一个转换为原始Mono的执行。只要Mono不评估,flatMapmap操作实际上就不会做任何事情。


我希望这会有所帮助。