这里所说的响应式流的生命周期是说我们从定义响应式流到触发这个流的处理所经历的不同阶段。 总的来说就是三个阶段。组装时、订阅时、运行时。其中组装时是代码的静态表达,订阅时、运行时描述的是响应式流程序运行起来时所设计的逻辑。
组装时
这个阶段就是我们建立处理模型的阶段。基本上是解决了下面三个方面的问题。
这个阶段我们通过使用诸如 just(), range(), fromArray(), push(), create(), generate()等方法来设置数据源头。
我们在最下游 publisher 上通过调用 subscribe()方法把 subscriber 从下游到上游依次传递到最上游的包含数据源的 publisher。
以上两个调用解决了数据来源于哪里、被谁最终接收的问题。但是在数据从上游被传递到下游的过程中,我们往往需要对数据做各种处理。这个阶段就各种 operator 大显身手的地方,比如 map(), flatMap(), filter(), reduce(), scan(), concatMap(), usingWhen()… … 实际上每经历一个 operator,就生成了一个新的中间级别的 publisher,这就是 reactive stream 的不可变性。
组装时基本就是我们写出的代码定义出的静态逻辑这部分。 程序运行起来,才会进入下面的两个阶段:订阅时、运行时,所以说这两个阶段是程序的动态表现。
订阅时
通过组装时我们定义了什么数据(publisher)经过怎样的处理(operator)最后传递给谁(subscriber)。而订阅时这个阶段,解决的问题是如何把调用下游 publisher 时传入的 subscriber 依次传递给上游的的 publisher。可以想象 Project Reactor 在传递 subscriber 的时候是依次进行封装之后传递的而不会是直接把下游的 subscriber 传递上去,因为以 operator 串联起来的各个 publisher 都需要“自己”的 subscriber。可以体会下这里“Subscriber 链”的概念。 这个传递过程很重要,因为 subscriber 中的 onSubscribe(Subscription s)提供了上游 publisher 把 Subscription 传递给下游 Subscriber 的机制。 因为 Subscriber 只有通过 subsciption 的 request 方法才能启动数据的流动。
运行时
经过组装时、订阅时,数据流已经“一触即发”。我们只要通过上游传递给我们的 Subscription 调用 request()方法就可以触发数据的流动了。 通过在 Subscirberd 的 onSubscription(), onNext()被回调时,向 Subscription 的 request()传入不同的数字,我们分别可以实现拉模型、推模型、拉-推模型。 响应式流的所谓运行时狭义的讲就是这种 Publisher 和 Subscriber 之间的信号交换,广义的讲也包括operator对数据个各种转换、处理。