1.概述
本教程将了解Reactor Flux和Core库Mono的区别。
2.Mono是什么?Mono是一种特殊类型的Publisher。Mono对象表示单个或空值。这意味着它最多只能是onnext() 请求发出一个值,然后以oncomplete()信号终止。如果失败,它只会发出oneror()信号。
看一个带有完成信号的Mono示例:
@Testpublic void givenMonoPublisher_whenSubscribeThenReturnSingleValue() { Mono<String> helloMono = Mono.just("Hello"); StepVerifier.create(helloMono) .expectNext("Hello") .expectComplete() .verify();}
这里可以看到,当helloMono被订阅时,它只发送一个值,然后发送完成信号。
3.Flux是什么?Flux是标准的Publisher,代表 0 到 N 异步序列值。这意味着它可以发出 0 对于多个值,onnnext()请求可能是无限值,然后以完成或错误信号终止。
让我们看一个带有完成信号的Flux示例:
@Testpublic void givenFluxPublisher_whenSubscribedThenReturnMultipleValues() { Flux<String> stringFlux = Flux.just("Hello", "Baeldung"); StepVerifier.create(stringFlux) .expectNext("Hello") .expectNext("Baeldung") .expectComplete() .verify();}
现在,让我们来看看Flux带有错误信号的示例:
@Testpublic void givenFluxPublisher_whenSubscribeThenReturnMultipleValuesWithError() { Flux<String> stringFlux = Flux.just("Hello", "Baeldung", "Error") .map(str -> { if (str.equals("Error")) throw new RuntimeException("Throwing Error"); return str; }); StepVerifier.create(stringFlux) .expectNext("Hello") .expectNext("Baeldung") .expectError() .verify();}
在这里可以看到,从 Flux 在得到两个值后,我们得到了一个错误。
4.Mono Vs FluxMono和Flux都是Publisher接口的实现。简单来说,我们可以说,当我们在计算或向数据库或外部服务提出请求并期望最多一个结果时,我们应该使用Mono。
Flux应用于我们的计算、数据库或外部服务调用,以获得多个结果。
Mono有点类似 Java Optional类,因为它包含 0 或 1 个值;Flux更像List,因为它可以有 N 个值。
5.结论了解Mono和Flux在本文中的区别。
和往常一样,示例的完整源代码可以存在 GitHub 上获得。
https://github.com/eugenp/tutorials/tree/master/reactor-core