Class BackpressureDrainManager

All Implemented Interfaces:
Serializable, Producer

@Experimental public final class BackpressureDrainManager extends AtomicLong implements Producer
Manages the producer-backpressure-consumer interplay by matching up available elements with requested elements and/or terminal events.
Since:
1.1.0
See Also:
  • Field Details

    • serialVersionUID

      private static final long serialVersionUID
      See Also:
    • emitting

      boolean emitting
      Indicates if one is in emitting phase, guarded by this.
    • terminated

      volatile boolean terminated
      Indicates a terminal state.
    • exception

      Throwable exception
      Indicates an error state, barrier is provided via terminated.
    • actual

      The callbacks to manage the drain.
  • Constructor Details

    • BackpressureDrainManager

      public BackpressureDrainManager(BackpressureDrainManager.BackpressureQueueCallback actual)
      Constructs a backpressure drain manager with 0 requestedCount, no terminal event and not emitting.
      Parameters:
      actual - he queue callback to check for new element availability
  • Method Details

    • isTerminated

      public boolean isTerminated()
      Checks if a terminal state has been reached.
      Returns:
      true if a terminal state has been reached
    • terminate

      public void terminate()
      Move into a terminal state. Call drain() anytime after.
    • terminate

      public void terminate(Throwable error)
      Move into a terminal state with an exception. Call drain() anytime after.

      Serialized access is expected with respect to element emission.

      Parameters:
      error - the exception to deliver
    • terminateAndDrain

      public void terminateAndDrain()
      Move into a terminal state and drain.
    • terminateAndDrain

      public void terminateAndDrain(Throwable error)
      Move into a terminal state with an exception and drain.

      Serialized access is expected with respect to element emission.

      Parameters:
      error - the exception to deliver
    • request

      public void request(long n)
      Description copied from interface: Producer
      Request a certain maximum number of items from this Producer. This is a way of requesting backpressure. To disable backpressure, pass Long.MAX_VALUE to this method.

      Requests are additive but if a sequence of requests totals more than Long.MAX_VALUE then Long.MAX_VALUE requests will be actioned and the extras may be ignored. Arriving at Long.MAX_VALUE by addition of requests cannot be assumed to disable backpressure. For example, the code below may result in Long.MAX_VALUE requests being actioned only.

       request(100);
       request(Long.MAX_VALUE-1);
       
      Specified by:
      request in interface Producer
      Parameters:
      n - the maximum number of items you want this Producer to produce, or Long.MAX_VALUE if you want the Producer to produce items at its own pace
    • drain

      public void drain()
      Try to drain the "queued" elements and terminal events by considering the available and requested event counts.