Spring 5 WebFlux Mono 和 Flux
Posted
技术标签:
【中文标题】Spring 5 WebFlux Mono 和 Flux【英文标题】:Spring 5 WebFlux Mono and Flux 【发布时间】:2018-12-12 02:13:15 【问题描述】:在 Spring 5 中,我只知道 Spring WebFlux Handler 方法处理请求并返回 Mono 或 Flux 作为响应。
@Component
public class HelloWorldHandler
public Mono<ServerResponse> helloWorld(ServerRequest request)
return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).body(BodyInserters.fromObject("Hello World"));
但我不知道 Mono 和 Flux 是什么意思,以及它如何与 WebFlux 处理程序一起使用。
谁能简单解释一下
1.Mono和Flux是什么意思。
2.它如何与 WebFlux 处理程序一起工作。
提前致谢。
【问题讨论】:
为什么不看官方文档???docs.spring.io/spring/docs/5.0.0.BUILD-SNAPSHOT/… @mrkernelpanic 这是一个更新、更好的官方文档页面,详细解释了Flux
和 Mono
是什么:projectreactor.io/docs/core/release/reference/…
【参考方案1】:
Webflux 完全是关于反应式编程,总而言之,这意味着业务逻辑仅在要处理的数据可用时才执行(反应式)。
这意味着您不再可以返回简单的 POJO,但您必须返回其他内容,即可以在可用时提供结果的内容。在reactive streams 倡议中,这称为Publisher
。 Publisher
有一个 subcribe()
方法,允许消费者在 POJO 可用时获取它。
Publisher
(例如 Publisher<Foo>
)可以返回零个或多个(可能是无限的)结果。为了更清楚您可以期待多少结果,Project Reactor(Pivotal 的反应式流实现)引入了 Publisher
的两个实现:
Mono
,将在发出单个结果后完成。
Flux
,它将发出零个或多个(可能是无限的)结果,然后完成。
所以,基本上你可以看到Mono<Foo>
是返回Foo
的反应式对应物,而Flux<Foo>
是Collection<Foo>
的反应式对应物。
例如:
Flux
.just(1, 2, 3, 4)
.map(nr -> nr * 2)
.subscribe(System.out::println);
即使数字已经可用(您可以看到它们),您应该意识到,由于它是 Flux
,它们会被一一发出。在其他情况下,这些数字可能来自外部 API,在这种情况下,它们不会立即可用。
下一阶段(map
运算符)将在检索到数字后立即将数字相乘,这意味着它也会一个一个地进行此映射,然后发出新值。
最终,有一个订阅者(应该总是有一个,但订阅的可能是 Spring 框架本身),在这种情况下,它将打印它获得的每个值,并将其打印到控制台,同样,一个一个.
您还应该意识到在处理这些项目时没有特定的顺序。可能是第一个数字已经打印在控制台上,而第三个数字还没有被乘以 2。
因此,在您的情况下,您有一个Mono<ServerResponse>
,这意味着只要ServerResponse
可用,WebFlux 框架就可以使用它。由于预计只有一个 ServerResponse
,因此它是 Mono
而不是 Flux
。
【讨论】:
非常感谢@g00glen00b 是否有解释 Flux 和 Mono for ex 的方法的 ant 文档。只是,flatMap 等。 @SalmanS 是的,Javadoc 可以。例如:Flux.flatMap()
.
那么 Mono 和 Flux 类似于 Future 吗?
@g*** Future
保证异步,但其中的操作不一定非阻塞。 Mono
/Flux
及其生态系统是异步和非阻塞的。更多信息可以在这里找到:***.com/questions/54866391/mono-vs-completablefuture以上是关于Spring 5 WebFlux Mono 和 Flux的主要内容,如果未能解决你的问题,请参考以下文章
Log Spring webflux 类型 - Mono 和 Flux
Spring webflux 反应式 Mono::subscribe
Spring Webflux(Mono/Flux) 与 AOP 在拦截时触发 REST 调用并使用 Mono/Flux