本系列其他文章见:《响应式Spring的道法术器》。
前情提要:响应式流 | Reactor3快速上手 | 深入理解响应式流规范
本文测试源码
2.8 Hot vs Cold
到目前为止,我们讨论的发布者,无论是Flux还是Mono,都有一个特点:订阅前什么都不会发生。当我们“创建”了一个Flux的时候,我们只是“声明”/“组装”了它,但是如果不调用.subscribe
来订阅它,它就不会开始发出元素。
但是我们对“数据流”(尤其是乍听到这个词的时候)会有种天然的感觉,就是无论有没有订阅者,它始终在按照自己的步伐发出数据。就像假设一个人没有一个粉丝,他也可以发微博一样。
以上这两种数据流分别称为“冷”序列和“热”序列。所以我们一直在介绍的Reactor3的发布者就属于“冷”的发布者。不过有少数的例外,比如just
生成的就是一个“热”序列,它直接在组装期就拿到数据,如果之后有谁订阅它,就重新发送数据给订阅者。Reactor 中多数其他的“热”发布者是扩展自Processor
的(下节会介绍到)。
下面我们通过对比了解一下两种不同的发布者的效果,首先是我们熟悉的“冷”发布者:
@Test
public void testCodeSequence() {
Flux<String> source = Flux.fromIterable(Arrays.asList("blue", "green", "orange", "purple"))
.map(String::toUpperCase);
source.subscribe(d -> System.out.println("Subscriber 1: "+d));
System.out.println();
source.subscribe(d -> System.out.println("Subscriber 2: "+d));
}
我们对发布者source
进行了两次订阅,每次订阅都导致它把数据流从新发一遍:
Subscriber 1: BLUE
Subscriber 1: GREEN
Subs