webflux系列--reactor源码(二)

操作符(Operator)

合并多个Flux

combineLatest

concat

concatMap

merge

repeat


cache

行为(behavior)

聚合操作

collect


reduce

distinct

group by


scan

其他


错误处理

Backpressure(背压)

event

retry

using

dematerialize,materialize

发布和订阅(hot流和cold流)

subscribe

	//subscribe(consumer,...) 最终调用
	public final Disposable subscribe(
			@Nullable Consumer<? super T> consumer,
			@Nullable Consumer<? super Throwable> errorConsumer,
			@Nullable Runnable completeConsumer,
			@Nullable Context initialContext) {
    
    
		return subscribeWith(new LambdaSubscriber<>(consumer, errorConsumer,
				completeConsumer,
				null,
				initialContext));
	}
	public final <E extends Subscriber<? super T>> E subscribeWith(E subscriber) {
    
    
		subscribe(subscriber);
		return subscriber;
	}

public final void subscribe(Subscriber<? super T> actual) {
    
    
		CorePublisher publisher = Operators.onLastAssembly(this);
		CoreSubscriber subscriber = Operators.toCoreSubscriber(actual);

		try {
    
    
            //如果Publisher是OptimizableOperator,则转换递归调用为loop调用。
			if (publisher instanceof OptimizableOperator) {
    
    
				OptimizableOperator operator = (OptimizableOperator) publisher;
				while (true) {
    
    
					subscriber = operator.subscribeOrReturn(subscriber);
					if (subscriber == null) {
    
    
						// null means "I will subscribe myself", returning...
						return;
					}
					OptimizableOperator newSource = operator.nextOptimizableSource();
					if (newSource == null) {
    
    
						publisher = operator.source();
						break;
					}
					operator = newSource;
				}
			}

			publisher.subscribe(subscriber);
		}
		catch (Throwable e) {
    
    
			Operators.reportThrowInSubscribe(subscriber, e);
			return;
		}
	}


	public final Flux<T> subscriberContext(Context mergeContext) {
    
    
		return subscriberContext(c -> c.putAll(mergeContext));
	}

	public final Flux<T> subscriberContext(Function<Context, Context> doOnContext) {
    
    
		return new FluxContextStart<>(this, doOnContext);
	}

将已有Cold流转变为Hot流

使用Processor构造Hot流

replay

基于时间的操作

timeout

超过设置的时间没有emit 元素,则抛出异常。

			

delay

defer

元素相关Operator

filter

public final Flux<T> filter(Predicate<? super T> p) {
    
    
    if (this instanceof Fuseable) {
    
    
        return onAssembly(new FluxFilterFuseable<>(this, p));
    }
	return onAssembly(new FluxFilter<>(this, p));	
}

final class FluxFilter<T> extends InternalFluxOperator<T, T> {
    
    

	final Predicate<? super T> predicate;
	
	static final class FilterSubscriber<T>
			implements InnerOperator<T, T>,
			           Fuseable.ConditionalSubscriber<T> {
    
    
		final CoreSubscriber<? super T> actual;
		final Context ctx;
		final Predicate<? super T> predicate;
		Subscription s;
		boolean done;
... ... ...                            

		@Override
		public void onSubscribe(Subscription s) {
    
    
			if (Operators.validate(this.s, s)) {
    
    
				this.s = s;
				actual.onSubscribe(this);
			}
		}

		@Override
		public void onNext(T t) {
    
    
			if (done) {
    
    
				Operators.onNextDropped(t,  this.ctx);
				return;
			}

			boolean b;

			try {
    
    
				b = predicate.test(t);
			}
			catch (Throwable e) {
    
    
				Throwable e_ = Operators.onNextError(t, e,  this.ctx, s);
				if (e_ != null) {
    
    
					onError(e_);
				}
				else {
    
    
					s.request(1);
				}
				Operators.onDiscard(t,  this.ctx);
				return;
			}
			if (b) {
    
    
                //发射出 元素。
				actual.onNext(t);
			}
			else {
    
    
                //触发 onDiscard
				Operators.onDiscard(t,  this.ctx);
                //请求下一个。
				s.request(1);
			}
		}

	}
}	

filterWhen与filter过程类似,不过将发射这一步修改为放入buffer中,直到流结束将整个buffer返回。

//把upstream的值通过一个Publisher把 value 映射为一个true或false,仅Publisher第一个发射的值被考虑,如果Publisher发射的值为empty,则 输入值不会映射成任何值。
class FluxFilterWhen<T> extends InternalFluxOperator<T, T> {
    
    
	final Function<? super T, ? extends Publisher<Boolean>> asyncPredicate;
	final int bufferSize;
	@Override
	public CoreSubscriber<? super T> subscribeOrReturn(CoreSubscriber<? super T> actual) {
    
    
		return new FluxFilterWhenSubscriber<>(actual, asyncPredicate, bufferSize);
	}
    
	static final class FluxFilterWhenSubscriber<T> implements InnerOperator<T, T> {
    
    
		final Function<? super T, ? extends Publisher<Boolean>> asyncPredicate;
        //缓存大小
		final int                                               bufferSize;
        //缓存数组,数组大小会被初始化:大于bufferSize的2个指数值的最小值。通过hash值计算下标 
		final AtomicReferenceArray<T>                           toFilter;
		final CoreSubscriber<? super T>                         actual;
		final Context                                           ctx;

		int          consumed;
        //消费者下标
		long         consumerIndex;
		long         emitted;
		Boolean      innerResult;
        //生产者下标
		long         producerIndex;
		Subscription upstream;

		volatile boolean         cancelled;
		volatile FilterWhenInner current;
		volatile boolean         done;
		volatile Throwable       error;
		volatile long            requested;
		volatile int             state;
		volatile int             wip;
        //条件常量。代表取消。
   		 static final FilterWhenInner INNER_CANCELLED = new FilterWhenInner(null, false);
        @Override
		public void request(long n) {
    
    
			if (Operators.validate(n)) {
    
    
				Operators.addCap(REQUESTED, this, n);
				drain();
			}
		}
    	@Override
		public void onNext(T t) {
    
    
			long pi = producerIndex;
			int m = toFilter.length() - 1;
			//计算下标
			int offset = (int)pi & m;
            //把元素加入缓存。
			toFilter.lazySet(offset, t);
			producerIndex = pi + 1;
			drain();
		}    
		@Override
		public void onSubscribe(Subscription s) {
    
    
			if (Operators.validate(upstream, s)) {
    
    
				upstream = s;
				actual.onSubscribe(this);
				s.request(bufferSize);
			}
		}      
        void drain() {
    
    
            if (WIP.getAndIncrement(this) != 0) {
    
    
                return;
            }

            int missed = 1;
            int limit = Operators.unboundedOrLimit(bufferSize);
            long e = emitted;
            long ci = consumerIndex;
            int f = consumed;
            int m = toFilter.length() - 1;
            Subscriber<? super T> a = actual;

            for (;;) {
    
    
                
                long r = requested;
				//发射的数量与requested数量不一样,则一直发送。
                while (e != r) {
    
    
                    if (cancelled) {
    
    
                        clear();
                        return;
                    }

                    boolean d = done;
				  //下标
                    int offset = (int)ci & m;
                    T t = toFilter.get(offset);
                    boolean empty = t == null;
                     //如果取消并且未获取到数据,则中断。
                    if (d && empty) {
    
    
                        Throwable ex = Exceptions.terminate(ERROR, this);
                        if (ex == null) {
    
    
                            a.onComplete();
                        } else {
    
    
                            a.onError(ex);
                        }
                        return;
                    }
                    //未取消,但是获取到null,退出。
                    if (empty) {
    
    
                        break;
                    }
					
                    int s = state;
                    if (s == STATE_FRESH) {
    
    
                        Publisher<Boolean> p;

                        try {
    
    
                            //获取映射到的Publisher
                            p = Objects.requireNonNull(asyncPredicate.apply(t), "The asyncPredicate returned a null value");
                        } catch (Throwable ex) {
    
    
                            Exceptions.throwIfFatal(ex);
                            Exceptions.addThrowable(ERROR, this, ex);
                            p = null; //discarded as "old" below
                        }
						//有Publisher,
                        if (p != null) {
    
    
                            //
                            if (p instanceof Callable) {
    
    
                                Boolean u;

                                try {
    
    
                                    u = ((Callable<Boolean>)p).call();
                                } catch (Throwable ex) {
    
    
                                    Exceptions.throwIfFatal(ex);
                                    Exceptions.addThrowable(ERROR, this, ex);
                                    u = null; //triggers discard below
                                }
                               //返回true,则发射元素元素t。
                                if (u != null && u) {
    
    
                                    a.onNext(t);
                                    e++;
                                }
                                //false,则取消元素t。
                                else {
    
    
                                    Operators.onDiscard(t, ctx);
                                }
                            } else {
    
    
                                //Publisher不是callable,
                                FilterWhenInner inner = new FilterWhenInner(this, !(p instanceof Mono));
                                if (CURRENT.compareAndSet(this,null, inner)) {
    
    
                                    state = STATE_RUNNING;
                                    p.subscribe(inner);
                                    break;
                                }
                            }
                        }
					  
                        T old = toFilter.getAndSet(offset, null);
                        Operators.onDiscard(old, ctx);
                        ci++;
                        if (++f == limit) {
    
    
                            f = 0;
                            upstream.request(limit);
                        }
                    } else
                        if (s == STATE_RESULT) {
    
    
                            Boolean u = innerResult;
                            innerResult = null;

                            if (u != null && u) {
    
    
                                a.onNext(t);
                                e++;
                            }
                            else {
    
    
                                Operators.onDiscard(t, ctx);
                            }

                            toFilter.lazySet(offset, null);
                            ci++;
                            if (++f == limit) {
    
    
                                f = 0;
                                upstream.request(limit);
                            }
                            state = STATE_FRESH;
                        } else {
    
    
                            break;
                        }
                }
				//发射的数量与requested数量一样。
                if (e == r) {
    
    
                    if (cancelled) {
    
    
                        clear();
                        return;
                    }

                    boolean d = done;

                    int offset = (int)ci & m;
                    T t = toFilter.get(offset);
                    boolean empty = t == null;

                    if (d && empty) {
    
    
                        Throwable ex = Exceptions.terminate(ERROR, this);
                        if (ex == null) {
    
    
                            a.onComplete();
                        } else {
    
    
                            a.onError(ex);
                        }
                        return;
                    }
                }

                int w = wip;
                if (missed == w) {
    
    
                    consumed = f;
                    consumerIndex = ci;
                    emitted = e;
                    missed = WIP.addAndGet(this, -missed);
                    if (missed == 0) {
    
    
                        break;
                    }
                } else {
    
    
                    missed = w;
                }
            }
        }
        
    }
    
    
	static final class FilterWhenInner implements InnerConsumer<Boolean> {
    
    
		final FluxFilterWhenSubscriber<?> parent;
		final boolean                     cancelOnNext;
		//是否已完成。
		boolean done;
		volatile Subscription sub;
		static final AtomicReferenceFieldUpdater<FilterWhenInner, Subscription> SUB =
				AtomicReferenceFieldUpdater.newUpdater(FilterWhenInner.class, Subscription.class, "sub");
... ... ... 


		@Override
		public void onSubscribe(Subscription s) {
    
    
    		//设置sub,并且请求所有元素。
			if (Operators.setOnce(SUB, this, s)) {
    
    
				s.request(Long.MAX_VALUE);
			}
		}

		@Override
		public void onNext(Boolean t) {
    
    
			if (!done) {
    
    
				if (cancelOnNext) {
    
    
					sub.cancel();
				}
				done = true;
				parent.innerResult(t);
			}
		}

		@Override
		public void onError(Throwable t) {
    
    
			if (!done) {
    
    
				done = true;
				parent.innerError(t);
			} else {
    
    
				Operators.onErrorDropped(t, parent.currentContext());
			}
		}

		@Override
		public void onComplete() {
    
    
			if (!done) {
    
    
				done = true;
				parent.innerComplete();
			}
		}

		void cancel() {
    
    
			Operators.terminate(SUB, this);
		}

}    

take

final class FluxTake<T> extends InternalFluxOperator<T, T> {
    
    
		@Override
		public void onNext(T t) {
    
    
			if (done) {
    
    
				Operators.onNextDropped(t, actual.currentContext());
				return;
			}

			long r = remaining;

			if (r == 0) {
    
    
				s.cancel();
				onComplete();
				return;
			}

			remaining = --r;
			boolean stop = r == 0L;

			actual.onNext(t);

			if (stop) {
    
    
				s.cancel();

				onComplete();
			}
		}

}

skip

final class FluxSkip<T> extends InternalFluxOperator<T, T> {
static final class SkipSubscriber<T>
}
}

sample

single

element


插入元素

switch

忽略元素值


then

sort


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));
	}
final class FluxMap<T, R> extends InternalFluxOperator<T, R> {
    
    
	final Function<? super T, ? extends R> mapper;
    
	public CoreSubscriber<? super T> subscribeOrReturn(CoreSubscriber<? super R> actual) {
    
    
		if (actual instanceof Fuseable.ConditionalSubscriber) {
    
    
			Fuseable.ConditionalSubscriber<? super R> cs =
					(Fuseable.ConditionalSubscriber<? super R>) actual;
			return new MapConditionalSubscriber<>(cs, mapper);
		}
        //包装Subscriber为MapSubscriber
		return new MapSubscriber<>(actual, mapper);
	}	
    
	static final class MapSubscriber<T, R>
			implements InnerOperator<T, R> {
    
    
		final CoreSubscriber<? super R>        actual;
		final Function<? super T, ? extends R> mapper;
		boolean done;
        //原始 Subscription
		Subscription s;
... ...
		@Override
		public void onSubscribe(Subscription s) {
    
    
			if (Operators.validate(this.s, s)) {
    
    
				this.s = s;
				actual.onSubscribe(this);
			}
		}

		@Override
		public void onNext(T t) {
    
    
			if (done) {
    
    
				Operators.onNextDropped(t, actual.currentContext());
				return;
			}

			R v;

			try {
    
    
                //应用mapper
				v = Objects.requireNonNull(mapper.apply(t),
						"The mapper returned a null value.");
			}
			catch (Throwable e) {
    
    
                //对异常进行处理。
				Throwable e_ = Operators.onNextError(t, e, actual.currentContext(), s);
				if (e_ != null) {
    
    
					onError(e_);
				}
				else {
    
    
					s.request(1);
				}
				return;
			}
			//把mapper处理之后的值 发射出去。
			actual.onNext(v);
		}

		@Override
		public void onError(Throwable t) {
    
    
			if (done) {
    
    
				Operators.onErrorDropped(t, actual.currentContext());
				return;
			}

			done = true;

			actual.onError(t);
		}

		@Override
		public void onComplete() {
    
    
			if (done) {
    
    
				return;
			}
			done = true;

			actual.onComplete();
		}
... ...
		@Override
		public void request(long n) {
    
    
    		//
			s.request(n);
		}
	}
    
}	

expand

杂项


拆分

window

buffer

回到同步操作


to

调试类Operator

log

elapsed

timestamp


checkpoint


猜你喜欢

转载自blog.csdn.net/demon7552003/article/details/112630380