首页 文章

Spring 5 WebFlux Mono和Flux

提问于
浏览
1

在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 Handler 一起使用 .

提前致谢 .

1 回答

  • 6

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

    这意味着您不再可以返回简单的POJO 's, but you have to return something else, something that can provide the result when it' . 在reactive streams计划中,这被称为Publisher . Publisher 有一个 subcribe() 方法,允许消费者在POJO可用时获取它 .

    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);
    

    即使这些数字已经可用(你可以看到它们),你应该意识到,因为它是 Flux ,所以它们立即可用 . 下一阶段( map 运算符)将在检索到数字后立即将该数字相乘,这意味着它也会逐个执行此映射,然后发出新值 .

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

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

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

相关问题