Project-Reactor中的操作符

612 阅读2分钟

Operator 操作符

在了解Flux和Mono之前,先了解一下操作符。 操作符并不存在于响应式流的定义中,是reactor自己抽象出来的概念,简单来说就是

Publisher + Operator = Publisher

用中文描述就是操作符中含有一些处理逻辑包装一个生产者成为一个新的生产者,操作符也是一个Publisher

image.png Operator有一个抽象类,采用模板方法封装了订阅的逻辑,我们来看下实现 InternalFluxOperator image.png 这个抽象类的作用其实就是在注册的时候其实调用的是第一个Publisher的subscribe方法

我们来看一个例子

Flux<String> just = Flux.just("1", "2", "3").map(i->i*2).subscribe(System.out::println);

其中我们已经知道了Flux.just内部是一个数组,最后的subscribe就是一个 LambdaSubscriber, 重点关注map方法

public final <V> Flux<V> map(Function<? super T, ? extends V> mapper) {
   if (this instanceof Fuseable) {
      return onAssembly(new FluxMapFuseable<>(this, mapper));
   }
   return onAssembly(new FluxMap<>(this, mapper));
}

其实就是判断一下如果源头是 Fuseable的就也创建一个 Fuseable 的东西, 注意创建FluxMapFuseable的时候source就是 Flux.just(1,2,3) 这个 FluxArray对象,所以一连串Operator的操作下来,整体图像如下

image.png

随后调用了subscribe方法,调用方是 FluxMapFuseable. 我们刚才也知道了,Operator的subscribe都在抽象层,方法中首先就是需要执行一个刚才看不懂的方法,我们这次去 FluxMapFuseable 看方法逻辑

image.png

image.png

看了源码后就了解了,在 操作符的subscribe过程中,不单单是调用真正的Publisher的subscribe方法,在途中包装了自己的操作符生成了自己的消费者

image.png 在subscribe结束之后,我们看FluxArray中的源码是调用了监听者的onSubscribe方法,并传入subscription

public static <T> void subscribe(CoreSubscriber<? super T> s, T[] array) {
   if (array.length == 0) {
      Operators.complete(s);
      return;
   }
   if (s instanceof ConditionalSubscriber) {
      s.onSubscribe(new ArrayConditionalSubscription<>((ConditionalSubscriber<? super T>) s, array));
   }
   else {
      s.onSubscribe(new ArraySubscription<>(s, array));
   }
}

所以方法又来到了MapSubscriber的onSubscribe方法,直接来分析一波MapSubscriber的四个重要方法

image.png

image.png

image.png

顺着onNext的调用一路下来就这样。

总结一下操作符的执行原理就是在创建的时候自己通过source包装了上一层的Publisher,然后在subscribe的时候又包装了下一层的Subscriber,在中间过度的时候执行自己的操作方法