二、如何使用 Flux 和 Mono 构建响应式数据流?

基本介绍

前面文章响应式编程基本介绍介绍了响应式编程的基础,其中就有响应式流规范,这是比较底层的规范,如果使用响应式流,要基于此开发,还是很有难度的。
而我们每天都在使用的 Spring 就是这样一款支持响应式编程的开发框架,Spring 5 的响应式编程模型以 Project Reactor 库为基础,而后者则实现了响应式流规范。

Reactor 异步数据序列

响应式流规范的基本组件是一个异步的数据序列,在 Reactor 框架中,我们可以把这个异步数据序列表示成如下形式:
在这里插入图片描述
上图中的异步序列模型从语义上可以用如下公式表示。

onNext x 0..N [onError | onComplete]

以上公式中包含了三种消息通知,分别对应在异步数据序列执行过程中的三种不同数据处理场景:

  • onNext:表示正常的包含元素的消息通知;
  • onComplete:表示序列结束的消息通知;
  • onError:表示序列出错的消息通知。

当触发这些消息通知时,异步序列的订阅者(Subscriber)中对应的这三个同名方法将被调用。正常情况下,onNext() 和 onComplete() 方法都应该被调用,用来正常消费数据并结束序列。如果没有调用 onComplete() 方法就会生成一个无界数据序列,在业务系统中,这通常是不合理的。而 onError() 方法只有序列出现异常时才会被调用。

基于上述异步数据序列,Reactor 框架提供了两个核心组件来发布数据,分别是 Flux 和 Mono 组件。这两个组件可以说是应用程序开发过程中最基本的编程对象。这篇文章,主要就是介绍 Flux 和 Mono 的基本使用。


通过 Flux 对象创建响应式流

基本介绍

Flux 代表的是一个包含 0 到 n 个元素的异步序列,Reactor 官网给出了它弹珠图(Marble Diagram)示意图:
在这里插入图片描述

类 Flux 说明,或者直接通过 IDEA 工具查看。

  • operator:代表操作符,对数据进行正常操作。
  • 红色的叉号:代表异常。
  • 最后的一个符号:代表序列正常结束。
    这三种消息,和数据系列完全一致,即:序列的三种消息通知都适用于 Flux。

创建 Flux 的方式非常多,但是大体可以分成两大类:一类是 基于各种工厂模式的静态创建方法;而另一类则 采用编程的方式 动态创建 Flux。相对而言,静态方法在使用上都比较简单,但不如动态方法来得灵活。


操作符

操作符(operator)并不是响应式流规范的一部分,但为了改进响应式代码的可读性并降低开发成本,Reactor 库中的 API 提供了一组丰富的操作符,这些操作符为响应式流规范提供了最大的附加值。操作符的执行效果如下所示:
在这里插入图片描述
在 Reactor 中,可以把操作符分成转换、过滤、组合、条件、数学、日志、调试等几大类,每一类中都提供了一批有用的操作符。尤其是针对转换场景,操作符非常健全。


通过静态方法创建 Flux

Reactor 中静态创建 Flux 的方法常见的包括 just()、range()、interval() 以及各种以 from- 为前缀的方法组等。同时,因为 Flux 可以代表 0 个数据,所以也有一些专门用于创建空序列的工具方法。

  • just() 方法

它可以指定序列中包含的全部元素,创建出来的 Flux 序列在发布这些元素之后会自动结束。一般情况下,在已知元素数量和内容时,使用 just() 方法是创建 Flux 的最简单直接的做法。使用 just() 方法创建 Flux 对象的示例代码如下所示:

Flux.just("data1", "data2").subscribe(System.out::println);

执行以上代码,我们将在系统控制台中得到如下结果:

data1
data2

这里我们对 Flux 执行了用于订阅的 subscribe() 方法,并通过使用 Lambda 表达式调用了 System.out.println() 方法,这意味着将结果打印到系统控制台。

  • fromXXX() 方法组
    如果我们已经有了一个数组、一个 Iterable 对象或 Stream 对象,那么就可以通过 Flux 提供的 fromXXX() 方法组来从这些对象中自动创建 Flux,包括 fromArray()、fromIterable() 和 fromStream() 方法。

上一讲我们提到了 Flux.fromIterable() 方法,这里再给出一个使用 fromArray() 方法创建 Flux 对象的示例代码,如下所示。

Flux.fromArray(new Integer[]{
   1, 2, 3})
         .subscribe(System.out::println);

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Flux.fromIterable(list).subscribe(System.out::println);

这段代码的执行结果就是在控制台中输出三行记录。


                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值