Flow.delayWith allows custom delay for each element. (#25000)
This commit is contained in:
parent
db141d0373
commit
6d893fb571
12 changed files with 500 additions and 44 deletions
|
|
@ -2656,6 +2656,42 @@ final class Source[Out, Mat](delegate: scaladsl.Source[Out, Mat]) extends Graph[
|
|||
def delay(of: java.time.Duration, strategy: DelayOverflowStrategy): Source[Out, Mat] =
|
||||
delay(of.asScala, strategy)
|
||||
|
||||
/**
|
||||
* Shifts elements emission in time by an amount individually determined through delay strategy a specified amount.
|
||||
* It allows to store elements in internal buffer while waiting for next element to be emitted. Depending on the defined
|
||||
* [[akka.stream.DelayOverflowStrategy]] it might drop elements or backpressure the upstream if
|
||||
* there is no space available in the buffer.
|
||||
*
|
||||
* It determines delay for each ongoing element invoking `DelayStrategy.nextDelay(elem: T): FiniteDuration`.
|
||||
*
|
||||
* Note that elements are not re-ordered: if an element is given a delay much shorter than its predecessor,
|
||||
* it will still have to wait for the preceding element before being emitted.
|
||||
* It is also important to notice that [[DelayStrategy]] can be stateful.
|
||||
*
|
||||
* Delay precision is 10ms to avoid unnecessary timer scheduling cycles.
|
||||
*
|
||||
* Internal buffer has default capacity 16. You can set buffer size by calling `addAttributes(inputBuffer)`
|
||||
*
|
||||
* '''Emits when''' there is a pending element in the buffer and configured time for this element elapsed
|
||||
* * EmitEarly - strategy do not wait to emit element if buffer is full
|
||||
*
|
||||
* '''Backpressures when''' depending on OverflowStrategy
|
||||
* * Backpressure - backpressures when buffer is full
|
||||
* * DropHead, DropTail, DropBuffer - never backpressures
|
||||
* * Fail - fails the stream if buffer gets full
|
||||
*
|
||||
* '''Completes when''' upstream completes and buffered elements have been drained
|
||||
*
|
||||
* '''Cancels when''' downstream cancels
|
||||
*
|
||||
* @param delayStrategySupplier creates new [[DelayStrategy]] object for each materialization
|
||||
* @param overFlowStrategy Strategy that is used when incoming elements cannot fit inside the buffer
|
||||
*/
|
||||
def delayWith(
|
||||
delayStrategySupplier: Supplier[DelayStrategy[Out]],
|
||||
overFlowStrategy: DelayOverflowStrategy): Source[Out, Mat] =
|
||||
new Source(delegate.delayWith(() => DelayStrategy.asScala(delayStrategySupplier.get), overFlowStrategy))
|
||||
|
||||
/**
|
||||
* Discard the given number of elements at the beginning of the stream.
|
||||
* No elements will be dropped if `n` is zero or negative.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue