Spring 5 WebFlux Mono和Flux

Sha*_*ika 5 spring java-8 spring-boot spring-webflux

在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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不知道MonoFlux是什么意思,以及它如何与WebFlux Handler协同工作.

可以任何人简单解释一下

1.什么意思是MonoFlux.

2.它如何与WebFlux处理程序一起使用.

提前致谢.

g00*_*00b 18

Webflux完全是关于反应式编程,总的来说,只有在处理数据时才能执行业务逻辑(反应性).

这意味着您不再能够返回简单的POJO,但您必须返回其他内容,这些内容可以在可用时提供结果.在反应流计划中,这被称为a Publisher.A Publisher有一种subcribe()方法可以让消费者在可用时获得POJO.

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

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

因此,基本上你可以Mono<Foo>看作回归的反应对应物FooFlux<Foo>作为反应对应物Collection<Foo>.

例如:

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

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

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

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

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