public final class

ReplayProcessor

extends FlowableProcessor<T>
java.lang.Object
   ↳ io.reactivex.Flowable<T>
     ↳ io.reactivex.processors.FlowableProcessor<T>
       ↳ io.reactivex.processors.ReplayProcessor<T>

Class Overview

Replays events to Subscribers.

The ReplayProcessor can be created in bounded and unbounded mode. It can be bounded by size (maximum number of elements retained at most) and/or time (maximum age of elements replayed).

This Processor respects the backpressure behavior of its Subscribers (individually) but does not coordinate their request amounts towards the upstream (because there might not be any).

Note that Subscribers receive a continuous sequence of values after they subscribed even if an individual item gets delayed due to backpressure.

Example usage:

 ReplayProcessor<Object> processor = new ReplayProcessor<T>();
  processor.onNext("one");
  processor.onNext("two");
  processor.onNext("three");
  processor.onComplete();

  // both of the following will get the onNext/onComplete calls from above
  processor.subscribe(subscriber1);
  processor.subscribe(subscriber2);

   

Summary

Public Methods
static <T> ReplayProcessor<T> create(int capacityHint)
Creates an unbounded ReplayProcessor with the specified initial buffer capacity.
static <T> ReplayProcessor<T> create()
Creates an unbounded ReplayProcessor.
static <T> ReplayProcessor<T> createWithSize(int maxSize)
Creates a size-bounded ReplayProcessor.
static <T> ReplayProcessor<T> createWithTime(long maxAge, TimeUnit unit, Scheduler scheduler)
Creates a time-bounded ReplayProcessor.
static <T> ReplayProcessor<T> createWithTimeAndSize(long maxAge, TimeUnit unit, Scheduler scheduler, int maxSize)
Creates a time- and size-bounded ReplayProcessor.
Throwable getThrowable()
Returns the error that caused the Subject to terminate or null if the Subject hasn't terminated yet.
T getValue()
Returns a single value the Subject currently has or null if no such value exists.
T[] getValues(T[] array)
Returns a typed array containing a snapshot of all values of the Subject.
Object[] getValues()
Returns an Object array containing snapshot all values of the Subject.
boolean hasComplete()
Returns true if the subject has reached a terminal state through a complete event.
boolean hasSubscribers()
Returns true if the subject has subscribers.
boolean hasThrowable()
Returns true if the subject has reached a terminal state through an error event.
boolean hasValue()
Returns true if the subject has any value.
void onComplete()
void onError(Throwable t)
void onNext(T t)
void onSubscribe(Subscription s)
Protected Methods
void subscribeActual(Subscriber<? super T> s)
Operator implementations (both source and intermediate) should implement this method that performs the necessary business logic.
[Expand]
Inherited Methods
From class io.reactivex.processors.FlowableProcessor
From class io.reactivex.Flowable
From class java.lang.Object
From interface io.reactivex.FlowableSubscriber
From interface org.reactivestreams.Publisher
From interface org.reactivestreams.Subscriber

Public Methods

public static ReplayProcessor<T> create (int capacityHint)

Creates an unbounded ReplayProcessor with the specified initial buffer capacity.

Use this method to avoid excessive array reallocation while the internal buffer grows to accommodate new items. For example, if you know that the buffer will hold 32k items, you can ask the ReplayProcessor to preallocate its internal array with a capacity to hold that many items. Once the items start to arrive, the internal array won't need to grow, creating less garbage and no overhead due to frequent array-copying.

Parameters
capacityHint the initial buffer capacity
Returns
  • the created subject

public static ReplayProcessor<T> create ()

Creates an unbounded ReplayProcessor.

The internal buffer is backed by an ArrayList and starts with an initial capacity of 16. Once the number of items reaches this capacity, it will grow as necessary (usually by 50%). However, as the number of items grows, this causes frequent array reallocation and copying, and may hurt performance and latency. This can be avoided with the create(int) overload which takes an initial capacity parameter and can be tuned to reduce the array reallocation frequency as needed.

Returns
  • the created ReplayProcessor

public static ReplayProcessor<T> createWithSize (int maxSize)

Creates a size-bounded ReplayProcessor.

In this setting, the ReplayProcessor holds at most size items in its internal buffer and discards the oldest item.

When observers subscribe to a terminated ReplayProcessor, they are guaranteed to see at most size onNext events followed by a termination event.

If an observer subscribes while the ReplayProcessor is active, it will observe all items in the buffer at that point in time and each item observed afterwards, even if the buffer evicts items due to the size constraint in the mean time. In other words, once an Observer subscribes, it will receive items without gaps in the sequence.

Parameters
maxSize the maximum number of buffered items
Returns
  • the created subject

public static ReplayProcessor<T> createWithTime (long maxAge, TimeUnit unit, Scheduler scheduler)

Creates a time-bounded ReplayProcessor.

In this setting, the ReplayProcessor internally tags each observed item with a timestamp value supplied by the Scheduler and keeps only those whose age is less than the supplied time value converted to milliseconds. For example, an item arrives at T=0 and the max age is set to 5; at T>=5 this first item is then evicted by any subsequent item or termination event, leaving the buffer empty.

Once the subject is terminated, observers subscribing to it will receive items that remained in the buffer after the terminal event, regardless of their age.

If an observer subscribes while the ReplayProcessor is active, it will observe only those items from within the buffer that have an age less than the specified time, and each item observed thereafter, even if the buffer evicts items due to the time constraint in the mean time. In other words, once an observer subscribes, it observes items without gaps in the sequence except for any outdated items at the beginning of the sequence.

Note that terminal notifications (onError and onComplete) trigger eviction as well. For example, with a max age of 5, the first item is observed at T=0, then an onComplete notification arrives at T=10. If an observer subscribes at T=11, it will find an empty ReplayProcessor with just an onComplete notification.

Parameters
maxAge the maximum age of the contained items
unit the time unit of time
scheduler the Scheduler that provides the current time
Returns
  • the created subject

public static ReplayProcessor<T> createWithTimeAndSize (long maxAge, TimeUnit unit, Scheduler scheduler, int maxSize)

Creates a time- and size-bounded ReplayProcessor.

In this setting, the ReplayProcessor internally tags each received item with a timestamp value supplied by the Scheduler and holds at most size items in its internal buffer. It evicts items from the start of the buffer if their age becomes less-than or equal to the supplied age in milliseconds or the buffer reaches its size limit.

When observers subscribe to a terminated ReplayProcessor, they observe the items that remained in the buffer after the terminal notification, regardless of their age, but at most size items.

If an observer subscribes while the ReplayProcessor is active, it will observe only those items from within the buffer that have age less than the specified time and each subsequent item, even if the buffer evicts items due to the time constraint in the mean time. In other words, once an observer subscribes, it observes items without gaps in the sequence except for the outdated items at the beginning of the sequence.

Note that terminal notifications (onError and onComplete) trigger eviction as well. For example, with a max age of 5, the first item is observed at T=0, then an onComplete notification arrives at T=10. If an observer subscribes at T=11, it will find an empty ReplayProcessor with just an onComplete notification.

Parameters
maxAge the maximum age of the contained items
unit the time unit of time
scheduler the Scheduler that provides the current time
maxSize the maximum number of buffered items
Returns
  • the created subject

public Throwable getThrowable ()

Returns the error that caused the Subject to terminate or null if the Subject hasn't terminated yet.

The method is thread-safe.

Returns
  • the error that caused the Subject to terminate or null if the Subject hasn't terminated yet

public T getValue ()

Returns a single value the Subject currently has or null if no such value exists.

The method is thread-safe.

Returns
  • a single value the Subject currently has or null if no such value exists

public T[] getValues (T[] array)

Returns a typed array containing a snapshot of all values of the Subject.

The method follows the conventions of Collection.toArray by setting the array element after the last value to null (if the capacity permits).

The method is thread-safe.

Parameters
array the target array to copy values into if it fits
Returns
  • the given array if the values fit into it or a new array containing all values

public Object[] getValues ()

Returns an Object array containing snapshot all values of the Subject.

The method is thread-safe.

Returns
  • the array containing the snapshot of all values of the Subject

public boolean hasComplete ()

Returns true if the subject has reached a terminal state through a complete event.

The method is thread-safe.

Returns
  • true if the subject has reached a terminal state through a complete event

public boolean hasSubscribers ()

Returns true if the subject has subscribers.

The method is thread-safe.

Returns
  • true if the subject has subscribers

public boolean hasThrowable ()

Returns true if the subject has reached a terminal state through an error event.

The method is thread-safe.

Returns
  • true if the subject has reached a terminal state through an error event

public boolean hasValue ()

Returns true if the subject has any value.

The method is thread-safe.

Returns
  • true if the subject has any value

public void onComplete ()

public void onError (Throwable t)

public void onNext (T t)

public void onSubscribe (Subscription s)

Protected Methods

protected void subscribeActual (Subscriber<? super T> s)

Operator implementations (both source and intermediate) should implement this method that performs the necessary business logic.

There is no need to call any of the plugin hooks on the current Flowable instance or the Subscriber.

Parameters
s the incoming Subscriber, never null