/** * Safely gate a subscriber subject concurrent Reactive Stream signals, thus serializing as a single sequence. * Note that serialization uses Thread Stealing and is vulnerable to cpu starving issues. * @param actual the subscriber to gate * @param <T> * @return a safe subscriber */ public static <T> Subscriber<T> create(Subscriber<T> actual){ return new SerializedSubscriber<>(actual); }
public PublisherSkipUntilMainSubscriber(Subscriber<? super T> actual) { this.actual = new SerializedSubscriber<>(actual); }
public PublisherTakeUntilMainSubscriber(Subscriber<? super T> actual) { this.actual = new SerializedSubscriber<>(actual); }
@Override public void subscribe(Subscriber<? super T> s) { Subscriber<T> serial = new SerializedSubscriber<>(s); PublisherSampleMainSubscriber<T> main = new PublisherSampleMainSubscriber<>(serial); s.onSubscribe(main); other.subscribe(new PublisherSampleOtherSubscriber<>(main)); source.subscribe(main); }
@Override public void subscribe(Subscriber<? super R> s) { SerializedSubscriber<R> serial = new SerializedSubscriber<>(s); PublisherWithLatestFromSubscriber<T, U, R> main = new PublisherWithLatestFromSubscriber<>(serial, combiner); PublisherWithLatestFromOtherSubscriber<U> secondary = new PublisherWithLatestFromOtherSubscriber<>(main); other.subscribe(secondary); source.subscribe(main); }
@Override public void subscribe(Subscriber<? super T> s) { PublisherRetryWhenOtherSubscriber other = new PublisherRetryWhenOtherSubscriber(); Subscriber<Throwable> signaller = new SerializedSubscriber<>(other.completionSignal); signaller.onSubscribe(SubscriptionHelper.empty()); Subscriber<T> serial = new SerializedSubscriber<>(s); PublisherRetryWhenMainSubscriber<T> main = new PublisherRetryWhenMainSubscriber<>(serial, signaller, source); other.main = main; serial.onSubscribe(main); Publisher<? extends Object> p; try { p = whenSourceFactory.apply(other); } catch (Throwable e) { ExceptionHelper.throwIfFatal(e); s.onError(ExceptionHelper.unwrap(e)); return; } if (p == null) { s.onError(new NullPointerException("The whenSourceFactory returned a null Publisher")); return; } p.subscribe(other); if (!main.cancelled) { source.subscribe(main); } }
@Override public void subscribe(Subscriber<? super T> s) { PublisherRepeatWhenOtherSubscriber other = new PublisherRepeatWhenOtherSubscriber(); Subscriber<Long> signaller = new SerializedSubscriber<>(other.completionSignal); signaller.onSubscribe(SubscriptionHelper.empty()); Subscriber<T> serial = new SerializedSubscriber<>(s); PublisherRepeatWhenMainSubscriber<T> main = new PublisherRepeatWhenMainSubscriber<>(serial, signaller, source); other.main = main; serial.onSubscribe(main); Publisher<?> p; try { p = whenSourceFactory.apply(other); } catch (Throwable e) { ExceptionHelper.throwIfFatal(e); s.onError(ExceptionHelper.unwrap(e)); return; } if (p == null) { s.onError(new NullPointerException("The whenSourceFactory returned a null Publisher")); return; } p.subscribe(other); if (!main.cancelled) { source.subscribe(main); } }
@Override public void subscribe(Subscriber<? super T> s) { SerializedSubscriber<T> serial = new SerializedSubscriber<>(s); PublisherTimeoutMainSubscriber<T, V> main = new PublisherTimeoutMainSubscriber<>(serial, itemTimeout, other); serial.onSubscribe(main); PublisherTimeoutTimeoutSubscriber ts = new PublisherTimeoutTimeoutSubscriber(main, 0L); main.setTimeout(ts); firstTimeout.subscribe(ts); source.subscribe(main); }