我是 Spring WebFlux 的新手,正在尝试将我的 Spring MVC 应用程序转换为 webflux。我从我的服务中返回一个 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 是否阻塞?
提前致谢 !
最佳答案
mono.subscribe(stores::addAll);
是异步的。这意味着,你告诉单声道它现在可以 开始 评估。
你要做的是继续处理
stores
马上 - 很有可能Mono
还没评价。那么,你怎么能解决这个问题?
您可以 区块直到
Mono
已完成:mono.doOnNext(stores::addAll).block()
当然,这违背了响应式编程的目的。您正在阻塞主线程,直到操作完成,这可以在没有 Reactor 的情况下以更简单的方式实现。
正确的方法是将其余代码从头到脚更改为响应式。这类似于您的第二个示例,其中您调用
dataexchange
是 Mono
的一部分,因此也被异步评估。要吸取的重要教训是像
map
这样的操作。或 flatMap
未对 Mono
的结果进行操作,但创建一个新的 Mono
这为原始 Mono
的执行添加了另一个转换.只要Mono
不评估,flatMap
或 map
操作实际上并没有做任何事情。我希望这有帮助。
关于reactive-programming - Spring webflux 中的 flatMap() 与 subscribe(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54647902/