Subscriber.
This processor does not have a public constructor by design; a new empty instance of this
BehaviorProcessor can be created via the create() method and
a new non-empty instance can be created via createDefault(Object) (named as such to avoid
overload resolution conflict with Flowable.create that creates a Flowable, not a BehaviorProcessor).
In accordance with the Reactive Streams specification (Rule 2.13)
nulls are not allowed as default initial values in createDefault(Object) or as parameters to onNext(Object) and
onError(Throwable).
When this BehaviorProcessor is terminated via onError(Throwable) or onComplete(), the
last observed item (if any) is cleared and late org.s only receive
the respective terminal event.
The BehaviorProcessor does not support clearing its cached value (to appear empty again), however, the
effect can be achieved by using a special item and making sure Subscribers subscribe through a
filter whose predicate filters out this special item:
BehaviorProcessor<Integer> processor = BehaviorProcessor.create();
final Integer EMPTY = Integer.MIN_VALUE;
Flowable<Integer> flowable = processor.filter(v -> v != EMPTY);
TestSubscriber<Integer> ts1 = flowable.test();
processor.onNext(1);
// this will "clear" the cache
processor.onNext(EMPTY);
TestSubscriber<Integer> ts2 = flowable.test();
processor.onNext(2);
processor.onComplete();
// ts1 received both non-empty items
ts1.assertResult(1, 2);
// ts2 received only 2 even though the current item was EMPTY
// when it got subscribed
ts2.assertResult(2);
// Subscribers coming after the processor was terminated receive
// no items and only the onComplete event in this case.
flowable.test().assertResult();
Even though BehaviorProcessor implements the Subscriber interface, calling
onSubscribe is not required (Rule 2.12)
if the processor is used as a standalone source. However, calling onSubscribe
after the BehaviorProcessor reached its terminal state will result in the
given Subscription being cancelled immediately.
Calling onNext(Object), offer(Object), onError(Throwable) and onComplete()
is required to be serialized (called from the same thread or called non-overlappingly from different threads
through external means of serialization). The toSerialized() method available to all FlowableProcessors
provides such serialization and also protects against reentrance (i.e., when a downstream Subscriber
consuming this processor also wants to call onNext(Object) on this processor recursively).
Note that serializing over offer(Object) is not supported through toSerialized() because it is a method
available on the PublishProcessor and BehaviorProcessor classes only.
This BehaviorProcessor supports the standard state-peeking methods hasComplete(), hasThrowable(),
getThrowable() and hasSubscribers() as well as means to read the latest observed value
in a non-blocking and thread-safe manner via hasValue() or getValue().
Note that this processor signals MissingBackpressureException if a particular Subscriber is not
ready to receive onNext events. To avoid this exception being signaled, use offer(Object) to only
try to emit an item when all Subscribers have requested item(s).
BehaviorProcessor does not coordinate requests of its downstream Subscribers and
expects each individual Subscriber is ready to receive onNext items when onNext(Object)
is called. If a Subscriber is not ready, a MissingBackpressureException is signalled to it.
To avoid overflowing the current Subscribers, the conditional offer(Object) method is available
that returns true if any of the Subscribers is not ready to receive onNext events. If
there are no Subscribers to the processor, offer() always succeeds.
If the BehaviorProcessor is (optionally) subscribed to another Publisher, this upstream
Publisher is consumed in an unbounded fashion (requesting Long#MAX_VALUE).BehaviorProcessor does not operate by default on a particular io.reactivex.rxjava3.core.Scheduler and
the Subscribers get notified on the thread the respective onXXX methods were invoked.onError(Throwable) is called, the BehaviorProcessor enters into a terminal state
and emits the same Throwable instance to the last set of Subscribers. During this emission,
if one or more Subscribers cancel their respective Subscriptions, the
Throwable is delivered to the global error handler via
io.reactivex.rxjava3.plugins.RxJavaPlugins#onError(Throwable) (multiple times if multiple Subscribers
cancel at once).
If there were no Subscribers subscribed to this BehaviorProcessor when the onError()
was called, the global error handler is not invoked.
Example usage:
// subscriber will receive all events.
BehaviorProcessor<Object> processor = BehaviorProcessor.create("default");
processor.subscribe(subscriber);
processor.onNext("one");
processor.onNext("two");
processor.onNext("three");
// subscriber will receive the "one", "two" and "three" events, but not "zero"
BehaviorProcessor<Object> processor = BehaviorProcessor.create("default");
processor.onNext("zero");
processor.onNext("one");
processor.subscribe(subscriber);
processor.onNext("two");
processor.onNext("three");
// subscriber will receive only onComplete
BehaviorProcessor<Object> processor = BehaviorProcessor.create("default");
processor.onNext("zero");
processor.onNext("one");
processor.onComplete();
processor.subscribe(subscriber);
// subscriber will receive only onError
BehaviorProcessor<Object> processor = BehaviorProcessor.create("default");
processor.onNext("zero");
processor.onNext("one");
processor.onError(new RuntimeException("error"));
processor.subscribe(subscriber);
| Modifier and Type | Class and Description |
|---|---|
| pack-priv static class |
| Modifier and Type | Field and Description |
|---|---|
| pack-priv static final BehaviorProcessor. | |
| pack-priv static final Object[] | |
| pack-priv long | |
| pack-priv final ReadWriteLock | |
| pack-priv final Lock | |
| pack-priv final AtomicReference | |
| pack-priv final AtomicReference | |
| pack-priv static final BehaviorProcessor. | |
| pack-priv final AtomicReference | |
| pack-priv final Lock |
| Access | Constructor and Description |
|---|---|
| pack-priv | |
| pack-priv | BehaviorProcessor(T
the initial value, not null (verified) defaultValue)Constructs a BehaviorProcessor with the given initial value. |
| Modifier and Type | Method and Description |
|---|---|
| pack-priv boolean | |
| public static < the type of item the BehaviorProcessor will emit T> @NonNull BehaviorProcessor | Returns: the constructedBehaviorProcessorCreates a |
| public static < the type of item the BehaviorProcessor will emit T> @NonNull BehaviorProcessor | Returns: the constructedBehaviorProcessorthe item that will be emitted first to any defaultValue)Subscriber as long as the
BehaviorProcessor has not yet observed any items from its source ObservableCreates a |
| public @Nullable Throwable | getThrowable()
Implements abstract io. |
| public T | Returns: a single value the BehaviorProcessor currently has or null if no such value existsReturns a single value the BehaviorProcessor currently has or null if no such value exists. |
| public boolean | hasComplete()
Implements abstract io. |
| public boolean | hasSubscribers()
Implements abstract io. |
| public boolean | hasThrowable()
Implements abstract io. |
| public boolean | Returns: true if the BehaviorProcessor has any valueReturns true if the BehaviorProcessor has any value. |
| public boolean | Returns: true if the item was emitted to all Subscribersthe item to emit, not t)nullTries to emit the item to all currently subscribed |
| public void | |
| public void | onError(@NonNull Throwable
the throwable signaled t)Implements org. |
| public void | onNext(T
the element signaled t)Implements org. Publisher in response to requests to Subscription#request(long).
|
| public void | onSubscribe(@NonNull Subscription
the s)Subscription that allows requesting data via Subscription#request(long)Implements org. Publisher#subscribe(Subscriber).
|
| pack-priv void | |
| pack-priv void | |
| protected void | |
| pack-priv int | |
| pack-priv BehaviorProcessor. |
| EMPTY | back to summary |
|---|---|
pack-priv static final BehaviorProcessor.
| |
| EMPTY_ARRAY | back to summary |
|---|---|
| pack-priv static final Object[] EMPTY_ARRAY | |
| index | back to summary |
|---|---|
| pack-priv long index | |
| lock | back to summary |
|---|---|
| pack-priv final ReadWriteLock lock | |
| readLock | back to summary |
|---|---|
| pack-priv final Lock readLock | |
| subscribers | back to summary |
|---|---|
| pack-priv final AtomicReference<BehaviorProcessor. | |
| terminalEvent | back to summary |
|---|---|
| pack-priv final AtomicReference<Throwable> terminalEvent | |
| TERMINATED | back to summary |
|---|---|
pack-priv static final BehaviorProcessor.
| |
| value | back to summary |
|---|---|
| pack-priv final AtomicReference<Object> value | |
| writeLock | back to summary |
|---|---|
| pack-priv final Lock writeLock | |
| BehaviorProcessor | back to summary |
|---|---|
| pack-priv BehaviorProcessor() Constructs an empty BehaviorProcessor.
| |
| BehaviorProcessor | back to summary |
|---|---|
| pack-priv BehaviorProcessor(T defaultValue) Constructs a BehaviorProcessor with the given initial value.
| |
| add | back to summary |
|---|---|
| pack-priv boolean add(BehaviorProcessor. | |
| create | back to summary |
|---|---|
| public static <T> @NonNull BehaviorProcessor Creates a
| |
| createDefault | back to summary |
|---|---|
| public static <T> @NonNull BehaviorProcessor Creates a
| |
| getThrowable | back to summary |
|---|---|
| public @Nullable Throwable getThrowable() Implements abstract io. Doc from io. Returns the error that caused the FlowableProcessor to terminate or null if the FlowableProcessor hasn't terminated yet. The method is thread-safe. | |
| getValue | back to summary |
|---|---|
| public T getValue() Returns a single value the BehaviorProcessor currently has or null if no such value exists. The method is thread-safe.
| |
| hasComplete | back to summary |
|---|---|
| public boolean hasComplete() Implements abstract io. Doc from io. Returns true if the FlowableProcessor has reached a terminal state through a complete event. The method is thread-safe.
| |
| hasSubscribers | back to summary |
|---|---|
| public boolean hasSubscribers() Implements abstract io. Doc from io. Returns true if the FlowableProcessor has subscribers. The method is thread-safe.
| |
| hasThrowable | back to summary |
|---|---|
| public boolean hasThrowable() Implements abstract io. Doc from io. Returns true if the FlowableProcessor has reached a terminal state through an error event. The method is thread-safe.
| |
| hasValue | back to summary |
|---|---|
| public boolean hasValue() Returns true if the BehaviorProcessor has any value. The method is thread-safe.
| |
| offer | back to summary |
|---|---|
| public boolean offer(T t) Tries to emit the item to all currently subscribed
This method should be called in a sequential manner just like the History: 2.0.8 - experimental
| |
| onComplete | back to summary |
|---|---|
| public void onComplete() Implements org. Doc from org. Successful terminal state.
No further events will be sent even if
| |
| onError | back to summary |
|---|---|
| public void onError(@NonNull Throwable t) Implements org. Doc from org. Failed terminal state.
No further events will be sent even if | |
| onNext | back to summary |
|---|---|
| public void onNext(T t) Implements org. Doc from org. Data notification sent by the
| |
| onSubscribe | back to summary |
|---|---|
| public void onSubscribe(@NonNull Subscription s) Implements org. Doc from org. Invoked after calling
No data will start flowing until
It is the responsibility of this
The
| |
| remove | back to summary |
|---|---|
pack-priv void remove(BehaviorProcessor.
| |
| setCurrent | back to summary |
|---|---|
| pack-priv void setCurrent(Object o) | |
| subscribeActual | back to summary |
|---|---|
protected void subscribeActual(@NonNull Subscriber<? super T> s)
| |
| subscriberCount | back to summary |
|---|---|
pack-priv int subscriberCount()
| |
| terminate | back to summary |
|---|---|
pack-priv BehaviorProcessor.
| |
| Modifier and Type | Field and Description |
|---|---|
| pack-priv volatile boolean | |
| pack-priv final Subscriber | |
| pack-priv boolean | |
| pack-priv boolean | |
| pack-priv long | |
| pack-priv boolean | |
| pack-priv AppendOnlyLinkedArrayList | |
| private static final long | |
| pack-priv final BehaviorProcessor |
| Access | Constructor and Description |
|---|---|
| pack-priv |
| Modifier and Type | Method and Description |
|---|---|
| public void | cancel()
Implements org. Publisher to stop sending data and clean up resources.
|
| pack-priv void | |
| pack-priv void | |
| pack-priv void | |
| public boolean | |
| public void | request(long
the strictly positive number of elements to requests to the upstream n)PublisherImplements org. Publisher until demand is signaled via this method.
|
| public boolean | test(Object
the value o)Implements io. |
| cancelled | back to summary |
|---|---|
| pack-priv volatile boolean cancelled | |
| downstream | back to summary |
|---|---|
| pack-priv final Subscriber<? super T> downstream | |
| emitting | back to summary |
|---|---|
| pack-priv boolean emitting | |
| fastPath | back to summary |
|---|---|
| pack-priv boolean fastPath | |
| index | back to summary |
|---|---|
| pack-priv long index | |
| next | back to summary |
|---|---|
| pack-priv boolean next | |
| queue | back to summary |
|---|---|
| pack-priv AppendOnlyLinkedArrayList<Object> queue | |
| serialVersionUID | back to summary |
|---|---|
| private static final long serialVersionUID Hides java. | |
| state | back to summary |
|---|---|
| pack-priv final BehaviorProcessor<T> state | |
| BehaviorSubscription | back to summary |
|---|---|
| pack-priv BehaviorSubscription(Subscriber<? super T> actual, BehaviorProcessor<T> state) | |
| cancel | back to summary |
|---|---|
| public void cancel() Implements org. Doc from org. Request the Data may still be sent to meet previously signalled demand after calling cancel.
| |
| emitFirst | back to summary |
|---|---|
| pack-priv void emitFirst() | |
| emitLoop | back to summary |
|---|---|
| pack-priv void emitLoop() | |
| emitNext | back to summary |
|---|---|
| pack-priv void emitNext(Object value, long stateIndex) | |
| isFull | back to summary |
|---|---|
| public boolean isFull() | |
| request | back to summary |
|---|---|
| public void request(long n) Implements org. Doc from org. No events will be sent by a
It can be called however often and whenever needed—but if the outstanding cumulative demand ever becomes Long.MAX_VALUE or more,
it may be treated by the
Whatever has been requested can be sent by the
A | |
| test | back to summary |
|---|---|
| public boolean test(Object o) Implements io. Doc from io. Test the given input value and return a boolean. | |