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 方法处理请求并返回 MonoFlux 作为响应。

@Component
public class HelloWorldHandler 
    public Mono<ServerResponse> helloWorld(ServerRequest request) 
        return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).body(BodyInserters.fromObject("Hello World"));
    

但我不知道 MonoFlux 是什么意思,以及它如何与 WebFlux 处理程序一起使用。

谁能简单解释一下

1.MonoFlux是什么意思。

2.它如何与 WebFlux 处理程序一起工作。

提前致谢。

【问题讨论】:

为什么不看官方文档???docs.spring.io/spring/docs/5.0.0.BUILD-SNAPSHOT/… @mrkernelpanic 这是一个更新、更好的官方文档页面,详细解释了 FluxMono 是什么:projectreactor.io/docs/core/release/reference/… 【参考方案1】:

Webflux 完全是关于反应式编程,总而言之,这意味着业务逻辑仅在要处理的数据可用时才执行(反应式)。

这意味着您不再可以返回简单的 POJO,但您必须返回其他内容,即可以在可用时提供结果的内容。在reactive streams 倡议中,这称为PublisherPublisher 有一个 subcribe() 方法,允许消费者在 POJO 可用时获取它。

Publisher(例如 Publisher&lt;Foo&gt;)可以返回零个或多个(可能是无限的)结果。为了更清楚您可以期待多少结果,Project Reactor(Pivotal 的反应式流实现)引入了 Publisher 的两个实现:

Mono,将在发出单个结果后完成。 Flux,它将发出零个或多个(可能是无限的)结果,然后完成。

所以,基本上你可以看到Mono&lt;Foo&gt; 是返回Foo 的反应式对应物,而Flux&lt;Foo&gt;Collection&lt;Foo&gt; 的反应式对应物。

例如:

Flux
    .just(1, 2, 3, 4)
    .map(nr -> nr * 2)
    .subscribe(System.out::println);

即使数字已经可用(您可以看到它们),您应该意识到,由于它是 Flux,它们会被一一发出。在其他情况下,这些数字可能来自外部 API,在这种情况下,它们不会立即可用。 下一阶段(map 运算符)将在检索到数字后立即将数字相乘,这意味着它也会一个一个地进行此映射,然后发出新值。

最终,有一个订阅者(应该总是有一个,但订阅的可能是 Spring 框架本身),在这种情况下,它将打印它获得的每个值,并将其打印到控制台,同样,一个一个.

您还应该意识到在处理这些项目时没有特定的顺序。可能是第一个数字已经打印在控制台上,而第三个数字还没有被乘以 2。

因此,在您的情况下,您有一个Mono&lt;ServerResponse&gt;,这意味着只要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 中提取价值

Spring webflux 反应式 Mono::subscribe

Spring Webflux(Mono/Flux) 与 AOP 在拦截时触发 REST 调用并使用 Mono/Flux

如何在 spring boot webflux 上从 mono<user> 获取用户名?

如何在不阻塞的情况下从 Spring Webflux 中的 Mono 对象中提取数据?