【问题标题】:Spring 5 WebFlux Mono and FluxSpring 5 WebFlux Mono 和 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 处理程序一起工作。

提前致谢。

【问题讨论】:

标签: spring spring-boot java-8 spring-webflux


【解决方案1】:

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

这意味着您不再可以返回简单的 POJO,但您必须返回其他内容,即可以在可用时提供结果的内容。在reactive streams 倡议中,这称为Publisher。 Publisher 有一个 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 吗?
  • @gstackoverflow Future 保证异步,但其中的操作不一定非阻塞。 Mono/Flux 及其生态系统是异步和非阻塞的。更多信息可以在这里找到:stackoverflow.com/questions/54866391/mono-vs-completablefuture
猜你喜欢
  • 2021-09-30
  • 2019-05-18
  • 2019-01-20
  • 2019-03-26
  • 2020-01-22
  • 2020-03-20
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
相关资源
最近更新 更多