Class SingleStateful<S>

java.lang.Object
com.couchbase.client.core.util.SingleStateful<S>
All Implemented Interfaces:
Stateful<S>

public class SingleStateful<S> extends Object implements Stateful<S>
Represents a single stateful component.

All state changes (including completion of the states() stream) happen while holding this object's monitor, so each subscriber sees the changes in the order they happened.

A subscriber is usually notified synchronously on the thread making the change, while that thread holds this object's monitor. This is not guaranteed, though: if a change happens while a new subscriber is still receiving the replayed latest state, the subscribing thread delivers the change to that subscriber possibly after the changing thread has released the monitor. Subscribers must not rely on either behavior.

Consequently, a subscriber must not block, and must not do work that might wait for a lock held by another thread that could be waiting for this object's monitor. A subscriber that needs to do anything non-trivial should first move to a different thread (with publishOn, for example).

  • Method Details

    • fromInitial

      public static <S> SingleStateful<S> fromInitial(S initialState)
      Creates a new stateful component with an initial state.
      Parameters:
      initialState - the initial state of the component.
      Returns:
      an initialized stateful component with the state provided.
    • fromInitial

      public static <S> SingleStateful<S> fromInitial(S initialState, BiConsumer<S,S> beforeTransitionCallback)
      Creates a new stateful component with an initial state.
      Parameters:
      initialState - the initial state of the component.
      Returns:
      an initialized stateful component with the state provided.
    • state

      public S state()
      Description copied from interface: Stateful
      Returns the current state of the stateful component.
      Specified by:
      state in interface Stateful<S>
    • states

      public reactor.core.publisher.Flux<S> states()
      Description copied from interface: Stateful
      Returns a stream of states for this component as they change.

      Subscribers may be notified synchronously while the component holds internal locks, so they must not block or do non-trivial work on the notifying thread. See SingleStateful for details.

      Specified by:
      states in interface Stateful<S>
    • transition

      public void transition(S newState)
      Transition into a new state, notifying consumers.

      Note that if the new state is identical to the old state no transition will be performed.

      Parameters:
      newState - the new state to apply.
    • compareAndTransition

      public boolean compareAndTransition(S expectedState, S newState)
      If the expected state is in place the new one is applied and consumers notified.
      Parameters:
      expectedState - the old expected state.
      newState - the new state to apply.
      Returns:
      true if the comparison has been successful.
    • close

      public void close()
      Completes the states() stream. Subsequent transitions still change the current state, but are not emitted.