在上一节入门课程中,我们知道 SpringWebFlux 是借助Reactor来实现的。该框架实现了响应式流规范。我们知道在响应式流规范中,存在代表发布者的 Publisher 接口,而 Reactor 提供了这一接口的两种实现,即 Flux 和 Mono,它们是我们利用 Reactor 框架进行响应式编程的基础组件。
接下来就简单介绍如何使用这两种实现来创建响应式数据流。
1. Flux 代表的是一个包含 0 到 n 个元素的异步序列
创建 Flux 的方式非常多,大体可以分成两大类,一类是基于各种工厂模式的静态创建方法,而另一类则采用编程的方式动态创建 Flux。相对而言,静态方法在使用上都比较简单,但不如动态方法来得灵活。我们来一起看一下。
所谓的静态方法形式的如 just()、error()、interval() 等等。动态方式就是通过编程的方式来构建数据流。
1.1 just()
示例:
public static void test_01(){
Flux.just(1,2,3).subscribe(System.out::println);
}
写法非常简单 just接收的是一个可变长参数,其实生成的就是3个整数的元素序列。subscribe方法是订阅的意思也就是消费元素的下游方法,这个后面在说。
1.2 fromXxx()
1.2.1 from(Publisher source)
示例:
public static void test_02(){
Flux.from(subscriber->{
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onNext(3);
subscriber.onComplete();
}).subscribe(System.out::println);
}
测试结果如下:
1
2
3
这里的subscriber
其实是一个订阅者对象,它是来消费消息的。对于Publisher 和 SubScriber两者的设计后面在深入。
1.2.2 fromIterable()
示例:
public static void test_03(){
Flux.fromIterable(Arrays.asList(1,2,3)).subscribe(System.out::println);
}
后面这四个fromXXX方法都是类似的。通过一个集合或者可迭代对象或者一个流来创建元素序列。
1.3 range() 生成整数数据流
示例:
public static void test_04(){
Flux.range(0, 10).subscribe(System.out::println);
}
1.4 interval() 周期性的生成连续的元素序列
示例:
public static void test_05(){
Flux.interval(Duration.ofMillis(2000), Duration.ofMillis(1000)).subscribe(System.out::println);
}
还可以通过 empty()、error() 和 never() 等创建一些特殊的序列。
1.5 generate() 编程方式创建
示例:
public static void test_06(){
Flux.generate(sink->{
sink.next(1);
// 停止
sink.complete();
}).subscribe(System.out::println);
Flux.generate(()->1, (i, sink)->{
sink.next(i++);
return i;
}).subscribe(System.out::println);
}
方法的定义如下:
public static <T> Flux<T> generate(Consumer<SynchronousSink<T>> generator)
generate
接收一个SynchronousSink
的消费者。这个类是用来生成数据流的。
- next 生成一个元素, 只能调用一次。
- complete 表示生成逻辑结束,如果不设置的话 默认会一直调用next方法生成元素。
而第二种重载方法,只不过多了一个状态管理。
1.6 create()
类似generate 不过使用的FluxSink 生成元素
public static <T> Flux<T> create(Consumer<? super FluxSink<T>> emitter)
示例:
public static void test_07(){
Flux.create(emitter->{
emitter.next(1);
emitter.next(2);
emitter.complete();
}).subscribe(System.out::println);
}
注意这里的next 可以调用多次。
2 Mono 0或者1个元素
Mono 其实就是Flux的特殊形式,Flux中的部分方法Mono同样适用。这里简单示意一个。
示例
public static void test_08(){
Mono.create(monoSink -> {
monoSink.success(1);
}).subscribe(System.out::println);
}
MonoSink 创建元素且只能创建一个。并没有complete等方法。
总结
本章只是简单介绍了如何利用Reactor的Mono和Flux实现构建一个异步数据流。只是简单的API的使用介绍,后期慢慢深入。
同时推荐大佬的文章,非常深入和透彻 。https://blog.csdn.net/get_set/article/details/79466657