Spring 5 WebFlux 单声道和 Flux

Spring 5 WebFlux Mono and Flux

在Spring5中我只知道SpringWebFlux Handler方法处理请求和returnsMonoFlux 作为回应。

@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.What 表示 MonoFlux.

2.How 它与 WebFlux 处理程序一起工作

提前致谢。

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

这意味着您不再可以 return 简单的 POJO,但您必须 return 其他东西,可以在可用时提供结果的东西。 reactive streams initiative, this is called a Publisher内。 Publisher 有一个 subcribe() 方法,允许消费者在 POJO 可用时获取它。

一个Publisher(例如Publisher<Foo>)可以return 零个或多个,可能是无限的结果。为了更清楚地说明您可以期待多少结果,Project Reactor(Pivotal 的反应流实现)引入了 Publisher 的两个实现:

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

因此,基本上您可以将 Mono<Foo> 视为 return 的反应对应物 Foo,将 Flux<Foo> 视为 Collection<Foo> 的反应对应物。

例如:

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

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

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

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

因此,在您的情况下,您有一个 Mono<ServerResponse>,这意味着只要 ServerResponse 可用,WebFlux 框架就可以使用它。由于预期只有一个 ServerResponse,因此它是 Mono 而不是 Flux