final class Flow[In, Out, Mat] extends Graph[FlowShape[In, Out], Mat]
A Flow
is a set of stream processing steps that has one open input and one open output.
- Source
- Flow.scala
- Alphabetic
- By Inheritance
- Flow
- Graph
- AnyRef
- Any
- by GraphMapMatVal
- by any2stringadd
- by StringFormat
- by Ensuring
- by ArrowAssoc
- Hide All
- Show All
- Public
- Protected
Instance Constructors
- new Flow(delegate: scaladsl.Flow[In, Out, Mat])
Type Members
Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##: Int
- Definition Classes
- AnyRef → Any
- def +(other: String): String
- def ->[B](y: B): (Flow[In, Out, Mat], B)
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- def addAttributes(attr: Attributes): Flow[In, Out, Mat]
Add the given attributes to this Flow.
Add the given attributes to this Flow. If the specific attribute was already present on this graph this means the added attribute will be more specific than the existing one. If this Flow is a composite of multiple graphs, new attributes on the composite will be less specific than attributes set directly on the individual graphs of the composite.
- def aggregateWithBoundary[Agg, Emit](allocate: Supplier[Agg], aggregate: Function2[Agg, Out, Pair[Agg, Boolean]], harvest: Function[Agg, Emit], emitOnTimer: Pair[Predicate[Agg], Duration]): Flow[In, Emit, Mat]
Aggregate input elements into an arbitrary data structure that can be completed and emitted downstream when custom condition is met which can be triggered by aggregate or timer.
Aggregate input elements into an arbitrary data structure that can be completed and emitted downstream when custom condition is met which can be triggered by aggregate or timer. It can be thought of a more general groupedWeightedWithin.
Emits when the aggregation function decides the aggregate is complete or the timer function returns true
Backpressures when downstream backpressures and the aggregate is complete
Completes when upstream completes and the last aggregate has been emitted downstream
Cancels when downstream cancels
- allocate
allocate the initial data structure for aggregated elements
- aggregate
update the aggregated elements, return true if ready to emit after update.
- harvest
this is invoked before emit within the current stage/operator
- emitOnTimer
decide whether the current aggregated elements can be emitted, the custom function is invoked on every interval
- Annotations
- @ApiMayChange()
- def alsoTo(that: Graph[SinkShape[Out], _]): Flow[In, Out, Mat]
Attaches the given Sink to this Flow, meaning that elements that passes through will also be sent to the Sink.
Attaches the given Sink to this Flow, meaning that elements that passes through will also be sent to the Sink.
It is similar to #wireTap but will backpressure instead of dropping elements when the given Sink is not ready.
Emits when element is available and demand exists both from the Sink and the downstream.
Backpressures when downstream or Sink backpressures
Completes when upstream completes
Cancels when downstream or Sink cancels
- def alsoToAll(those: Graph[SinkShape[Out], _]*): Flow[In, Out, Mat]
Attaches the given Sinks to this Flow, meaning that elements that passes through will also be sent to all those Sinks.
Attaches the given Sinks to this Flow, meaning that elements that passes through will also be sent to all those Sinks.
It is similar to #wireTap but will backpressure instead of dropping elements when the given Sinks is not ready.
Emits when element is available and demand exists both from the Sinks and the downstream.
Backpressures when downstream or any of the Sinks backpressures
Completes when upstream completes
Cancels when downstream or any of the Sinks cancels
- Annotations
- @varargs() @SafeVarargs()
- def alsoToMat[M2, M3](that: Graph[SinkShape[Out], M2], matF: Function2[Mat, M2, M3]): Flow[In, Out, M3]
Attaches the given Sink to this Flow, meaning that elements that passes through will also be sent to the Sink.
Attaches the given Sink to this Flow, meaning that elements that passes through will also be sent to the Sink.
It is similar to #wireTapMat but will backpressure instead of dropping elements when the given Sink is not ready.
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.- See also
- def asFlowWithContext[U, CtxU, CtxOut](collapseContext: Function2[U, CtxU, In], extractContext: Function[Out, CtxOut]): FlowWithContext[U, CtxU, Out, CtxOut, Mat]
Turns a Flow into a FlowWithContext which manages a context per element along a stream.
Turns a Flow into a FlowWithContext which manages a context per element along a stream.
- collapseContext
turn each incoming pair of element and context value into an element of this Flow
- extractContext
turn each outgoing element of this Flow into an outgoing context value
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def asScala: scaladsl.Flow[In, Out, Mat]
Converts this Flow to its Scala DSL counterpart
- def ask[S](parallelism: Int, ref: ActorRef, mapTo: Class[S], timeout: Timeout): Flow[In, S, Mat]
Use the
ask
pattern to send a request-reply message to the targetref
actor.Use the
ask
pattern to send a request-reply message to the targetref
actor. If any of the asks times out it will fail the stream with a pekko.pattern.AskTimeoutException.The
mapTo
class parameter is used to cast the incoming responses to the expected response type.Similar to the plain ask pattern, the target actor is allowed to reply with
org.apache.pekko.util.Status
. Anorg.apache.pekko.util.Status#Failure
will cause the operator to fail with the cause carried in theFailure
message.Parallelism limits the number of how many asks can be "in flight" at the same time. Please note that the elements emitted by this operator are in-order with regards to the asks being issued (i.e. same behavior as mapAsync).
The operator fails with an pekko.stream.WatchedActorTerminatedException if the target actor is terminated.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when any of the CompletionStages returned by the provided function complete
Backpressures when the number of futures reaches the configured parallelism and the downstream backpressures
Completes when upstream completes and all futures have been completed and all elements have been emitted
Fails when the passed in actor terminates, or a timeout is exceeded in any of the asks performed
Cancels when downstream cancels
- def ask[S](ref: ActorRef, mapTo: Class[S], timeout: Timeout): Flow[In, S, Mat]
Use the
ask
pattern to send a request-reply message to the targetref
actor.Use the
ask
pattern to send a request-reply message to the targetref
actor. If any of the asks times out it will fail the stream with a pekko.pattern.AskTimeoutException.The
mapTo
class parameter is used to cast the incoming responses to the expected response type.Similar to the plain ask pattern, the target actor is allowed to reply with
org.apache.pekko.util.Status
. Anorg.apache.pekko.util.Status#Failure
will cause the operator to fail with the cause carried in theFailure
message.Defaults to parallelism of 2 messages in flight, since while one ask message may be being worked on, the second one still be in the mailbox, so defaulting to sending the second one a bit earlier than when first ask has replied maintains a slightly healthier throughput.
The operator fails with an pekko.stream.WatchedActorTerminatedException if the target actor is terminated.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when any of the CompletionStages returned by the provided function complete
Backpressures when the number of futures reaches the configured parallelism and the downstream backpressures
Completes when upstream completes and all futures have been completed and all elements have been emitted
Fails when the passed in actor terminates, or a timeout is exceeded in any of the asks performed
Cancels when downstream cancels
- def async(dispatcher: String, inputBufferSize: Int): Flow[In, Out, Mat]
Put an asynchronous boundary around this
Flow
- def async(dispatcher: String): Flow[In, Out, Mat]
Put an asynchronous boundary around this
Flow
- def async: Flow[In, Out, Mat]
Put an asynchronous boundary around this
Flow
- def backpressureTimeout(timeout: Duration): Flow[In, Out, Mat]
If the time between the emission of an element and the following downstream demand exceeds the provided timeout, the stream is failed with a org.apache.pekko.stream.BackpressureTimeoutException.
If the time between the emission of an element and the following downstream demand exceeds the provided timeout, the stream is failed with a org.apache.pekko.stream.BackpressureTimeoutException. The timeout is checked periodically, so the resolution of the check is one period (equals to timeout value).
Emits when upstream emits an element
Backpressures when downstream backpressures
Completes when upstream completes or fails if timeout elapses between element emission and downstream demand.
Cancels when downstream cancels
- Annotations
- @nowarn()
- def batch[S](max: Long, seed: Function[Out, S], aggregate: Function2[S, Out, S]): Flow[In, S, Mat]
Allows a faster upstream to progress independently of a slower subscriber by aggregating elements into batches until the subscriber is ready to accept them.
Allows a faster upstream to progress independently of a slower subscriber by aggregating elements into batches until the subscriber is ready to accept them. For example a batch step might store received elements in an array up to the allowed max limit if the upstream publisher is faster.
This element only rolls up elements if the upstream is faster, but if the downstream is faster it will not duplicate elements.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when downstream stops backpressuring and there is an aggregated element available
Backpressures when there are
max
batched elements and 1 pending element and downstream backpressuresCompletes when upstream completes and there is no batched/pending element waiting
Cancels when downstream cancels
See also Flow.conflate, Flow.batchWeighted
- max
maximum number of elements to batch before backpressuring upstream (must be positive non-zero)
- seed
Provides the first state for a batched value using the first unconsumed element as a start
- aggregate
Takes the currently batched value and the current pending element to produce a new aggregate
- def batchWeighted[S](max: Long, costFn: Function[Out, Long], seed: Function[Out, S], aggregate: Function2[S, Out, S]): Flow[In, S, Mat]
Allows a faster upstream to progress independently of a slower subscriber by aggregating elements into batches until the subscriber is ready to accept them.
Allows a faster upstream to progress independently of a slower subscriber by aggregating elements into batches until the subscriber is ready to accept them. For example a batch step might concatenate
ByteString
elements up to the allowed max limit if the upstream publisher is faster.This element only rolls up elements if the upstream is faster, but if the downstream is faster it will not duplicate elements.
Batching will apply for all elements, even if a single element cost is greater than the total allowed limit. In this case, previous batched elements will be emitted, then the "heavy" element will be emitted (after being applied with the
seed
function) without batching further elements with it, and then the rest of the incoming elements are batched.Emits when downstream stops backpressuring and there is a batched element available
Backpressures when there are
max
weighted batched elements + 1 pending element and downstream backpressuresCompletes when upstream completes and there is no batched/pending element waiting
Cancels when downstream cancels
See also Flow.conflate, Flow.batch
- max
maximum weight of elements to batch before backpressuring upstream (must be positive non-zero)
- costFn
a function to compute a single element weight
- seed
Provides the first state for a batched value using the first unconsumed element as a start
- aggregate
Takes the currently batched value and the current pending element to produce a new batch
- def buffer(size: Int, overflowStrategy: OverflowStrategy): Flow[In, Out, Mat]
Adds a fixed size buffer in the flow that allows to store elements from a faster upstream until it becomes full.
Adds a fixed size buffer in the flow that allows to store elements from a faster upstream until it becomes full. Depending on the defined pekko.stream.OverflowStrategy it might drop elements or backpressure the upstream if there is no space available
Emits when downstream stops backpressuring and there is a pending element in the buffer
Backpressures when downstream backpressures or 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
- size
The size of the buffer in element count
- overflowStrategy
Strategy that is used when incoming elements cannot fit inside the buffer
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @HotSpotIntrinsicCandidate() @native()
- def collect[T](pf: PartialFunction[Out, T]): Flow[In, T, Mat]
Transform this stream by applying the given partial function to each of the elements on which the function is defined as they pass through this processing step.
Transform this stream by applying the given partial function to each of the elements on which the function is defined as they pass through this processing step. Non-matching elements are filtered out.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when the provided partial function is defined for the element
Backpressures when the partial function is defined for the element and downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def collectFirst[T](pf: PartialFunction[Out, T]): Flow[In, T, Mat]
Transform this stream by applying the given partial function to the first element on which the function is defined as it pass through this processing step, and cancel the upstream publisher after the first element is emitted.
Transform this stream by applying the given partial function to the first element on which the function is defined as it pass through this processing step, and cancel the upstream publisher after the first element is emitted.
Non-matching elements are filtered out.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when the provided partial function is defined for the first element
Backpressures when the partial function is defined for the element and downstream backpressures
Completes when upstream completes or the first element is emitted
Cancels when downstream cancels
- def collectType[T](clazz: Class[T]): Flow[In, T, Mat]
Transform this stream by testing the type of each of the elements on which the element is an instance of the provided type as they pass through this processing step.
Transform this stream by testing the type of each of the elements on which the element is an instance of the provided type as they pass through this processing step. Non-matching elements are filtered out.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when the element is an instance of the provided type
Backpressures when the element is an instance of the provided type and downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def collectWhile[T](pf: PartialFunction[Out, T]): Flow[In, T, Mat]
Transform this stream by applying the given partial function to each of the elements on which the function is defined as they pass through this processing step, and cancel the upstream publisher after the partial function is not applied.
Transform this stream by applying the given partial function to each of the elements on which the function is defined as they pass through this processing step, and cancel the upstream publisher after the partial function is not applied.
The stream will be completed without producing any elements if the partial function is not applied for the first stream element, eg: there is a downstream buffer.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when the provided partial function is defined for the element
Backpressures when the partial function is defined for the element and downstream backpressures
Completes when upstream completes or the partial function is not applied.
Cancels when downstream cancels
- Since
1.1.0
- def completionTimeout(timeout: Duration): Flow[In, Out, Mat]
If the completion of the stream does not happen until the provided timeout, the stream is failed with a org.apache.pekko.stream.CompletionTimeoutException.
If the completion of the stream does not happen until the provided timeout, the stream is failed with a org.apache.pekko.stream.CompletionTimeoutException.
Emits when upstream emits an element
Backpressures when downstream backpressures
Completes when upstream completes or fails if timeout elapses before upstream completes
Cancels when downstream cancels
- Annotations
- @nowarn()
- def concat[M](that: Graph[SourceShape[Out], M]): Flow[In, Out, Mat]
Concatenate the given Source to this Flow, meaning that once this Flow’s input is exhausted and all result elements have been generated, the Source’s elements will be produced.
Concatenate the given Source to this Flow, meaning that once this Flow’s input is exhausted and all result elements have been generated, the Source’s elements will be produced.
Note that the Source is materialized together with this Flow and is "detached" meaning it will in effect behave as a one element buffer in front of both the sources, that eagerly demands an element on start (so it can not be combined with
Source.lazy
to defer materialization ofthat
).The second source is then kept from producing elements by asserting back-pressure until its time comes.
When needing a concat operator that is not detached use #concatLazy
Emits when element is available from current stream or from the given Source when current is completed
Backpressures when downstream backpressures
Completes when given Source completes
Cancels when downstream cancels
- def concatAllLazy(those: Graph[SourceShape[Out], _]*): Flow[In, Out, Mat]
Concatenate the given Sources to this Flow, meaning that once this Flow’s input is exhausted and all result elements have been generated, the Source’s elements will be produced.
Concatenate the given Sources to this Flow, meaning that once this Flow’s input is exhausted and all result elements have been generated, the Source’s elements will be produced.
Note that the Sources are materialized together with this Flow. If
lazy
materialization is what is needed the operator can be combined with for exampleSource.lazySource
to defer materialization ofthat
until the time when this source completes.The second source is then kept from producing elements by asserting back-pressure until its time comes.
For a concat operator that is detached, use #concat
If this Flow gets upstream error - no elements from the given Sources will be pulled.
Emits when element is available from current stream or from the given Sources when current is completed
Backpressures when downstream backpressures
Completes when given all those Sources completes
Cancels when downstream cancels
- Annotations
- @varargs() @SafeVarargs()
- def concatLazy[M](that: Graph[SourceShape[Out], M]): Flow[In, Out, Mat]
Concatenate the given Source to this Flow, meaning that once this Flow’s input is exhausted and all result elements have been generated, the Source’s elements will be produced.
Concatenate the given Source to this Flow, meaning that once this Flow’s input is exhausted and all result elements have been generated, the Source’s elements will be produced.
Note that the Source is materialized together with this Flow. If
lazy
materialization is what is needed the operator can be combined with for exampleSource.lazySource
to defer materialization ofthat
until the time when this source completes.The second source is then kept from producing elements by asserting back-pressure until its time comes.
For a concat operator that is detached, use #concat
If this Flow gets upstream error - no elements from the given Source will be pulled.
Emits when element is available from current stream or from the given Source when current is completed
Backpressures when downstream backpressures
Completes when given Source completes
Cancels when downstream cancels
- def concatLazyMat[M, M2](that: Graph[SourceShape[Out], M], matF: Function2[Mat, M, M2]): Flow[In, Out, M2]
Concatenate the given Source to this Flow, meaning that once this Flow’s input is exhausted and all result elements have been generated, the Source’s elements will be produced.
Concatenate the given Source to this Flow, meaning that once this Flow’s input is exhausted and all result elements have been generated, the Source’s elements will be produced.
Note that the Source is materialized together with this Flow, if
lazy
materialization is what is needed the operator can be combined withSource.lazy
to defer materialization ofthat
.The second source is then kept from producing elements by asserting back-pressure until its time comes.
For a concat operator that is detached, use #concatMat
- See also
#concatLazy. It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.
- def concatMat[M, M2](that: Graph[SourceShape[Out], M], matF: Function2[Mat, M, M2]): Flow[In, Out, M2]
Concatenate the given Source to this Flow, meaning that once this Flow’s input is exhausted and all result elements have been generated, the Source’s elements will be produced.
Concatenate the given Source to this Flow, meaning that once this Flow’s input is exhausted and all result elements have been generated, the Source’s elements will be produced.
Note that the Source is materialized together with this Flow and is "detached" meaning it will in effect behave as a one element buffer in front of both the sources, that eagerly demands an element on start (so it can not be combined with
Source.lazy
to defer materialization ofthat
).The second source is then kept from producing elements by asserting back-pressure until its time comes.
When needing a concat operator that is not detached use #concatLazyMat
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.- See also
- def conflate(aggregate: Function2[Out, Out, Out]): Flow[In, Out, Mat]
Allows a faster upstream to progress independently of a slower subscriber by conflating elements into a summary until the subscriber is ready to accept them.
Allows a faster upstream to progress independently of a slower subscriber by conflating elements into a summary until the subscriber is ready to accept them. For example a conflate step might average incoming numbers if the upstream publisher is faster.
This version of conflate does not change the output type of the stream. See Flow.conflateWithSeed for a more flexible version that can take a seed function and transform elements while rolling up.
This element only rolls up elements if the upstream is faster, but if the downstream is faster it will not duplicate elements.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when downstream stops backpressuring and there is a conflated element available
Backpressures when never
Completes when upstream completes
Cancels when downstream cancels
see also Flow.conflateWithSeed Flow.batch Flow.batchWeighted
- aggregate
Takes the currently aggregated value and the current pending element to produce a new aggregate
- def conflateWithSeed[S](seed: Function[Out, S], aggregate: Function2[S, Out, S]): Flow[In, S, Mat]
Allows a faster upstream to progress independently of a slower subscriber by conflating elements into a summary until the subscriber is ready to accept them.
Allows a faster upstream to progress independently of a slower subscriber by conflating elements into a summary until the subscriber is ready to accept them. For example a conflate step might average incoming numbers if the upstream publisher is faster.
This version of conflate allows to derive a seed from the first element and change the aggregated type to be different than the input type. See Flow.conflate for a simpler version that does not change types.
This element only rolls up elements if the upstream is faster, but if the downstream is faster it will not duplicate elements.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when downstream stops backpressuring and there is a conflated element available
Backpressures when never
Completes when upstream completes
Cancels when downstream cancels
see also Flow.conflate Flow.batch Flow.batchWeighted
- seed
Provides the first state for a conflated value using the first unconsumed element as a start
- aggregate
Takes the currently aggregated value and the current pending element to produce a new aggregate
- def contramap[In2](f: Function[In2, In]): Flow[In2, Out, Mat]
Transform this Flow by applying a function to each *incoming* upstream element before it is passed to the Flow
- def delay(of: Duration, strategy: DelayOverflowStrategy): Flow[In, Out, Mat]
Shifts elements emission in time by a specified amount.
Shifts elements emission in time by a specified amount. It allows to store elements in internal buffer while waiting for next element to be emitted. Depending on the defined pekko.stream.DelayOverflowStrategy it might drop elements or backpressure the upstream if there is no space available in the buffer.
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
- of
time to shift all messages
- strategy
Strategy that is used when incoming elements cannot fit inside the buffer
- Annotations
- @nowarn()
- def delayWith(delayStrategySupplier: Supplier[DelayStrategy[Out]], overFlowStrategy: DelayOverflowStrategy): Flow[In, Out, Mat]
Shifts elements emission in time by an amount individually determined through delay strategy a specified amount.
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 pekko.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
- delayStrategySupplier
creates new DelayStrategy object for each materialization
- overFlowStrategy
Strategy that is used when incoming elements cannot fit inside the buffer
- def detach: Flow[In, Out, Mat]
Detaches upstream demand from downstream demand without detaching the stream rates; in other words acts like a buffer of size 1.
Detaches upstream demand from downstream demand without detaching the stream rates; in other words acts like a buffer of size 1.
Emits when upstream emits an element
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def dimap[In2, Out2](f: Function[In2, In], g: Function[Out, Out2]): Flow[In2, Out2, Mat]
Transform this Flow by applying a function
f
to each *incoming* upstream element before it is passed to the Flow, and a functiong
to each *outgoing* downstream element.Transform this Flow by applying a function
f
to each *incoming* upstream element before it is passed to the Flow, and a functiong
to each *outgoing* downstream element.Emits when the mapping function
g
returns an elementBackpressures when original Flow backpressures
Completes when original Flow completes
Cancels when original Flow cancels
- Since
1.1.0
- def divertTo(that: Graph[SinkShape[Out], _], when: Predicate[Out]): Flow[In, Out, Mat]
Attaches the given Sink to this Flow, meaning that elements will be sent to the Sink instead of being passed through if the predicate
when
returnstrue
.Attaches the given Sink to this Flow, meaning that elements will be sent to the Sink instead of being passed through if the predicate
when
returnstrue
.Emits when emits when an element is available from the input and the chosen output has demand
Backpressures when the currently chosen output back-pressures
Completes when upstream completes and no output is pending
Cancels when any of the downstreams cancel
- def divertToMat[M2, M3](that: Graph[SinkShape[Out], M2], when: Predicate[Out], matF: Function2[Mat, M2, M3]): Flow[In, Out, M3]
Attaches the given Sink to this Flow, meaning that elements will be sent to the Sink instead of being passed through if the predicate
when
returnstrue
.Attaches the given Sink to this Flow, meaning that elements will be sent to the Sink instead of being passed through if the predicate
when
returnstrue
.- See also
#divertTo It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.
- def drop(n: Long): Flow[In, Out, Mat]
Discard the given number of elements at the beginning of the stream.
Discard the given number of elements at the beginning of the stream. No elements will be dropped if
n
is zero or negative.Emits when the specified number of elements has been dropped already
Backpressures when the specified number of elements has been dropped and downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def dropWhile(p: Predicate[Out]): Flow[In, Out, Mat]
Discard elements at the beginning of the stream while predicate is true.
Discard elements at the beginning of the stream while predicate is true. All elements will be taken after predicate returns false first time.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when predicate returned false and for all following stream elements
Backpressures when predicate returned false and downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def dropWithin(duration: Duration): Flow[In, Out, Mat]
Discard the elements received within the given duration at beginning of the stream.
Discard the elements received within the given duration at beginning of the stream.
Emits when the specified time elapsed and a new upstream element arrives
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- Annotations
- @nowarn()
- def ensuring(cond: (Flow[In, Out, Mat]) => Boolean, msg: => Any): Flow[In, Out, Mat]
- def ensuring(cond: (Flow[In, Out, Mat]) => Boolean): Flow[In, Out, Mat]
- def ensuring(cond: Boolean, msg: => Any): Flow[In, Out, Mat]
- def ensuring(cond: Boolean): Flow[In, Out, Mat]
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- def expand[U](expander: Function[Out, Iterator[U]]): Flow[In, U, Mat]
Allows a faster downstream to progress independently of a slower upstream by extrapolating elements from an older element until new element comes from the upstream.
Allows a faster downstream to progress independently of a slower upstream by extrapolating elements from an older element until new element comes from the upstream. For example an expand step might repeat the last element for the subscriber until it receives an update from upstream.
This element will never "drop" upstream elements as all elements go through at least one extrapolation step. This means that if the upstream is actually faster than the upstream it will be backpressured by the downstream subscriber.
Expand does not support pekko.stream.Supervision#restart and pekko.stream.Supervision#resume. Exceptions from the
expander
function will complete the stream with failure.See also #extrapolate for a version that always preserves the original element and allows for an initial "startup" element.
Emits when downstream stops backpressuring
Backpressures when downstream backpressures or iterator runs empty
Completes when upstream completes
Cancels when downstream cancels
- expander
Takes the current extrapolation state to produce an output element and the next extrapolation state.
- See also
- def extrapolate(extrapolator: Function[Out, Iterator[Out]], initial: Out): Flow[In, Out, Mat]
Allows a faster downstream to progress independent of a slower upstream.
Allows a faster downstream to progress independent of a slower upstream.
This is achieved by introducing "extrapolated" elements - based on those from upstream - whenever downstream signals demand.
Extrapolate does not support pekko.stream.Supervision#restart and pekko.stream.Supervision#resume. Exceptions from the
extrapolate
function will complete the stream with failure.See also #expand for a version that can overwrite the original element.
Emits when downstream stops backpressuring, AND EITHER upstream emits OR initial element is present OR
extrapolate
is non-empty and applicableBackpressures when downstream backpressures or current
extrapolate
runs emptyCompletes when upstream completes and current
extrapolate
runs emptyCancels when downstream cancels
- extrapolator
Takes the current upstream element and provides a sequence of "extrapolated" elements based on the original, to be emitted in case downstream signals demand.
- initial
The initial element to be emitted, in case upstream is able to stall the entire stream.
- See also
- def extrapolate(extrapolator: Function[Out, Iterator[Out]]): Flow[In, Out, Mat]
Allows a faster downstream to progress independent of a slower upstream.
Allows a faster downstream to progress independent of a slower upstream.
This is achieved by introducing "extrapolated" elements - based on those from upstream - whenever downstream signals demand.
Extrapolate does not support pekko.stream.Supervision#restart and pekko.stream.Supervision#resume. Exceptions from the
extrapolate
function will complete the stream with failure.See also #expand for a version that can overwrite the original element.
Emits when downstream stops backpressuring, AND EITHER upstream emits OR initial element is present OR
extrapolate
is non-empty and applicableBackpressures when downstream backpressures or current
extrapolate
runs emptyCompletes when upstream completes and current
extrapolate
runs emptyCancels when downstream cancels
- extrapolator
Takes the current upstream element and provides a sequence of "extrapolated" elements based on the original, to be emitted in case downstream signals demand.
- See also
- def filter(p: Predicate[Out]): Flow[In, Out, Mat]
Only pass on those elements that satisfy the given predicate.
Only pass on those elements that satisfy the given predicate.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when the given predicate returns true for the element
Backpressures when the given predicate returns true for the element and downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def filterNot(p: Predicate[Out]): Flow[In, Out, Mat]
Only pass on those elements that NOT satisfy the given predicate.
Only pass on those elements that NOT satisfy the given predicate.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when the given predicate returns false for the element
Backpressures when the given predicate returns false for the element and downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def flatMapConcat[T, M](f: Function[Out, _ <: Graph[SourceShape[T], M]]): Flow[In, T, Mat]
Transform each input element into a
Source
of output elements that is then flattened into the output stream by concatenation, fully consuming one Source after the other.Transform each input element into a
Source
of output elements that is then flattened into the output stream by concatenation, fully consuming one Source after the other.Emits when a currently consumed substream has an element available
Backpressures when downstream backpressures
Completes when upstream completes and all consumed substreams complete
Cancels when downstream cancels
- def flatMapMerge[T, M](breadth: Int, f: Function[Out, _ <: Graph[SourceShape[T], M]]): Flow[In, T, Mat]
Transform each input element into a
Source
of output elements that is then flattened into the output stream by merging, where at mostbreadth
substreams are being consumed at any given time.Transform each input element into a
Source
of output elements that is then flattened into the output stream by merging, where at mostbreadth
substreams are being consumed at any given time.Emits when a currently consumed substream has an element available
Backpressures when downstream backpressures
Completes when upstream completes and all consumed substreams complete
Cancels when downstream cancels
- def flatMapPrefix[Out2, Mat2](n: Int, f: Function[Iterable[Out], Flow[Out, Out2, Mat2]]): Flow[In, Out2, Mat]
Takes up to
n
elements from the stream (less thann
only if the upstream completes before emittingn
elements), then applyf
on these elements in order to obtain a flow, this flow is then materialized and the rest of the input is processed by this flow (similar to via).Takes up to
n
elements from the stream (less thann
only if the upstream completes before emittingn
elements), then applyf
on these elements in order to obtain a flow, this flow is then materialized and the rest of the input is processed by this flow (similar to via). This method returns a flow consuming the rest of the stream producing the materialized flow's output.Emits when the materialized flow emits. Notice the first
n
elements are buffered internally before materializing the flow and connecting it to the rest of the upstream - producing elements at its own discretion (might 'swallow' or multiply elements).Backpressures when downstream backpressures
Completes when the materialized flow completes. If upstream completes before producing
n
elements,f
will be applied with the provided elements, the resulting flow will be materialized and signalled for upstream completion, it can then complete or continue to emit elements at its own discretion.Cancels when the materialized flow cancels. Notice that when downstream cancels prior to prefix completion, the cancellation cause is stashed until prefix completion (or upstream completion) and then handed to the materialized flow.
- n
the number of elements to accumulate before materializing the downstream flow.
- f
a function that produces the downstream flow based on the upstream's prefix.
- def flatMapPrefixMat[Out2, Mat2, Mat3](n: Int, f: Function[Iterable[Out], Flow[Out, Out2, Mat2]], matF: Function2[Mat, CompletionStage[Mat2], Mat3]): Flow[In, Out2, Mat3]
mat version of #flatMapPrefix, this method gives access to a future materialized value of the downstream flow (as a completion stage).
mat version of #flatMapPrefix, this method gives access to a future materialized value of the downstream flow (as a completion stage). see #flatMapPrefix for details.
- def fold[T](zero: T, f: Function2[T, Out, T]): Flow[In, T, Mat]
Similar to
scan
but only emits its result when the upstream completes, after which it also completes.Similar to
scan
but only emits its result when the upstream completes, after which it also completes. Applies the given functionf
towards its current and next value, yielding the next current value.Adheres to the ActorAttributes.SupervisionStrategy attribute.
If the function
f
throws an exception and the supervision decision is pekko.stream.Supervision#restart current value starts atzero
again the stream will continue.Note that the
zero
value must be immutable.Emits when upstream completes
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def foldAsync[T](zero: T, f: Function2[T, Out, CompletionStage[T]]): Flow[In, T, Mat]
Similar to
fold
but with an asynchronous function.Similar to
fold
but with an asynchronous function. Applies the given function towards its current and next value, yielding the next current value.Adheres to the ActorAttributes.SupervisionStrategy attribute.
If the function
f
returns a failure and the supervision decision is pekko.stream.Supervision.Restart current value starts atzero
again the stream will continue.Note that the
zero
value must be immutable.Emits when upstream completes
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def foldWhile[T](zero: T, p: Predicate[T], f: Function2[T, Out, T]): Flow[In, T, Mat]
Similar to
scan
but only emits its result when the upstream completes or the predicatep
returnsfalse
.Similar to
scan
but only emits its result when the upstream completes or the predicatep
returnsfalse
. after which it also completes. Applies the given function towards its current and next value, yielding the next current value.If the function
f
throws an exception and the supervision decision is pekko.stream.Supervision.Restart current value starts atzero
again the stream will continue.Adheres to the ActorAttributes.SupervisionStrategy attribute.
Note that the
zero
value must be immutable.Emits when upstream completes or the predicate
p
returnsfalse
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
See also FlowOps.fold
- Since
1.1.0
- def getAttributes: Attributes
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @HotSpotIntrinsicCandidate() @native()
- def groupBy[K](maxSubstreams: Int, f: Function[Out, K]): SubFlow[In, Out, Mat]
This operation demultiplexes the incoming stream into separate output streams, one for each element key.
This operation demultiplexes the incoming stream into separate output streams, one for each element key. The key is computed for each element using the given function. When a new key is encountered for the first time a new substream is opened and subsequently fed with all elements belonging to that key.
WARNING: The operator keeps track of all keys of streams that have already been closed. If you expect an infinite number of keys this can cause memory issues. Elements belonging to those keys are drained directly and not send to the substream.
- See also
- def groupBy[K](maxSubstreams: Int, f: Function[Out, K], allowClosedSubstreamRecreation: Boolean): SubFlow[In, Out, Mat]
This operation demultiplexes the incoming stream into separate output streams, one for each element key.
This operation demultiplexes the incoming stream into separate output streams, one for each element key. The key is computed for each element using the given function. When a new key is encountered for the first time a new substream is opened and subsequently fed with all elements belonging to that key.
WARNING: If
allowClosedSubstreamRecreation
is set tofalse
(default behavior) the operator keeps track of all keys of streams that have already been closed. If you expect an infinite number of keys this can cause memory issues. Elements belonging to those keys are drained directly and not send to the substream.Note: If
allowClosedSubstreamRecreation
is set totrue
substream completion and incoming elements are subject to race-conditions. If elements arrive for a stream that is in the process of closing these elements might get lost.The object returned from this method is not a normal Flow, it is a SubFlow. This means that after this operator all transformations are applied to all encountered substreams in the same fashion. Substream mode is exited either by closing the substream (i.e. connecting it to a Sink) or by merging the substreams back together; see the
to
andmergeBack
methods on SubFlow for more information.It is important to note that the substreams also propagate back-pressure as any other stream, which means that blocking one substream will block the
groupBy
operator itself—and thereby all substreams—once all internal or explicit buffers are filled.If the group by function
f
throws an exception and the supervision decision is pekko.stream.Supervision#stop the stream and substreams will be completed with failure.If the group by function
f
throws an exception and the supervision decision is pekko.stream.Supervision#resume or pekko.stream.Supervision#restart the element is dropped and the stream and substreams continue.Function
f
MUST NOT returnnull
. This will throw exception and trigger supervision decision mechanism.Emits when an element for which the grouping function returns a group that has not yet been created. Emits the new group
Backpressures when there is an element pending for a group whose substream backpressures
Completes when upstream completes
Cancels when downstream cancels and all substreams cancel
- maxSubstreams
configures the maximum number of substreams (keys) that are supported; if more distinct keys are encountered then the stream fails
- f
computes the key for each element
- allowClosedSubstreamRecreation
enables recreation of already closed substreams if elements with their corresponding keys arrive after completion
- def grouped(n: Int): Flow[In, List[Out], Mat]
Chunk up this stream into groups of the given size, with the last group possibly smaller than requested due to end-of-stream.
Chunk up this stream into groups of the given size, with the last group possibly smaller than requested due to end-of-stream.
n
must be positive, otherwise IllegalArgumentException is thrown.Emits when the specified number of elements has been accumulated or upstream completed
Backpressures when a group has been assembled and downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def groupedWeighted(minWeight: Long, costFn: Function[Out, Long]): Flow[In, List[Out], Mat]
Chunk up this stream into groups of elements that have a cumulative weight greater than or equal to the
minWeight
, with the last group possibly smaller than requestedminWeight
due to end-of-stream.Chunk up this stream into groups of elements that have a cumulative weight greater than or equal to the
minWeight
, with the last group possibly smaller than requestedminWeight
due to end-of-stream.minWeight
must be positive, otherwise IllegalArgumentException is thrown.costFn
must return a non-negative result for all inputs, otherwise the stage will fail with an IllegalArgumentException.Emits when the cumulative weight of elements is greater than or equal to the
minWeight
or upstream completedBackpressures when a buffered group weighs more than
minWeight
and downstream backpressuresCompletes when upstream completes
Cancels when downstream cancels
- def groupedWeightedWithin(maxWeight: Long, maxNumber: Int, costFn: Function[Out, Long], duration: Duration): Flow[In, List[Out], Mat]
Chunk up this stream into groups of elements received within a time window, or limited by the weight and number of the elements, whatever happens first.
Chunk up this stream into groups of elements received within a time window, or limited by the weight and number of the elements, whatever happens first. Empty groups will not be emitted if no elements are received from upstream. The last group before end-of-stream will contain the buffered elements since the previously emitted group.
Emits when the configured time elapses since the last group has been emitted or weight limit reached
Backpressures when downstream backpressures, and buffered group (+ pending element) weighs more than
maxWeight
or has more thanmaxNumber
elementsCompletes when upstream completes (emits last group)
Cancels when downstream completes
maxWeight
must be positive,maxNumber
must be positive, andduration
must be greater than 0 seconds, otherwise IllegalArgumentException is thrown. - def groupedWeightedWithin(maxWeight: Long, costFn: Function[Out, Long], duration: Duration): Flow[In, List[Out], Mat]
Chunk up this stream into groups of elements received within a time window, or limited by the weight of the elements, whatever happens first.
Chunk up this stream into groups of elements received within a time window, or limited by the weight of the elements, whatever happens first. Empty groups will not be emitted if no elements are received from upstream. The last group before end-of-stream will contain the buffered elements since the previously emitted group.
Emits when the configured time elapses since the last group has been emitted or weight limit reached
Backpressures when downstream backpressures, and buffered group (+ pending element) weighs more than
maxWeight
Completes when upstream completes (emits last group)
Cancels when downstream completes
maxWeight
must be positive, andduration
must be greater than 0 seconds, otherwise IllegalArgumentException is thrown.- Annotations
- @nowarn()
- def groupedWithin(maxNumber: Int, duration: Duration): Flow[In, List[Out], Mat]
Chunk up this stream into groups of elements received within a time window, or limited by the given number of elements, whatever happens first.
Chunk up this stream into groups of elements received within a time window, or limited by the given number of elements, whatever happens first. Empty groups will not be emitted if no elements are received from upstream. The last group before end-of-stream will contain the buffered elements since the previously emitted group.
Emits when the configured time elapses since the last group has been emitted or
n
elements is bufferedBackpressures when downstream backpressures, and there are
n+1
buffered elementsCompletes when upstream completes (emits last group)
Cancels when downstream completes
maxNumber
must be positive, andduration
must be greater than 0 seconds, otherwise IllegalArgumentException is thrown.- Annotations
- @nowarn()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @HotSpotIntrinsicCandidate() @native()
- def idleTimeout(timeout: Duration): Flow[In, Out, Mat]
If the time between two processed elements exceeds the provided timeout, the stream is failed with a org.apache.pekko.stream.StreamIdleTimeoutException.
If the time between two processed elements exceeds the provided timeout, the stream is failed with a org.apache.pekko.stream.StreamIdleTimeoutException. The timeout is checked periodically, so the resolution of the check is one period (equals to timeout value).
Emits when upstream emits an element
Backpressures when downstream backpressures
Completes when upstream completes or fails if timeout elapses between two emitted elements
Cancels when downstream cancels
- Annotations
- @nowarn()
- def initialDelay(delay: Duration): Flow[In, Out, Mat]
Delays the initial element by the specified duration.
Delays the initial element by the specified duration.
Emits when upstream emits an element if the initial delay is already elapsed
Backpressures when downstream backpressures or initial delay is not yet elapsed
Completes when upstream completes
Cancels when downstream cancels
- Annotations
- @nowarn()
- def initialTimeout(timeout: Duration): Flow[In, Out, Mat]
If the first element has not passed through this operator before the provided timeout, the stream is failed with a org.apache.pekko.stream.InitialTimeoutException.
If the first element has not passed through this operator before the provided timeout, the stream is failed with a org.apache.pekko.stream.InitialTimeoutException.
Emits when upstream emits an element
Backpressures when downstream backpressures
Completes when upstream completes or fails if timeout elapses before first element arrives
Cancels when downstream cancels
- Annotations
- @nowarn()
- def interleave(that: Graph[SourceShape[Out], _], segmentSize: Int, eagerClose: Boolean): Flow[In, Out, Mat]
Interleave is a deterministic merge of the given Source with elements of this Flow.
Interleave is a deterministic merge of the given Source with elements of this Flow. It first emits
segmentSize
number of elements from this flow to downstream, then - same amount forthat
source, then repeat process.If eagerClose is false and one of the upstreams complete the elements from the other upstream will continue passing through the interleave operator. If eagerClose is true and one of the upstream complete interleave will cancel the other upstream and complete itself.
If this Flow or Source gets upstream error - stream completes with failure.
Emits when element is available from the currently consumed upstream
Backpressures when downstream backpressures. Signal to current upstream, switch to next upstream when received
segmentSize
elementsCompletes when the Flow and given Source completes
Cancels when downstream cancels
- def interleave(that: Graph[SourceShape[Out], _], segmentSize: Int): Flow[In, Out, Mat]
Interleave is a deterministic merge of the given Source with elements of this Flow.
Interleave is a deterministic merge of the given Source with elements of this Flow. It first emits
segmentSize
number of elements from this flow to downstream, then - same amount forthat
source, then repeat process.Example:
Source<Integer, ?> src = Source.from(Arrays.asList(1, 2, 3)) Flow<Integer, Integer, ?> flow = flow.interleave(Source.from(Arrays.asList(4, 5, 6, 7)), 2) src.via(flow) // 1, 2, 4, 5, 3, 6, 7
After one of upstreams is complete than all the rest elements will be emitted from the second one
If this Flow or Source gets upstream error - stream completes with failure.
Emits when element is available from the currently consumed upstream
Backpressures when downstream backpressures. Signal to current upstream, switch to next upstream when received
segmentSize
elementsCompletes when the Flow and given Source completes
Cancels when downstream cancels
- def interleaveAll(those: List[_ <: Graph[SourceShape[Out], _]], segmentSize: Int, eagerClose: Boolean): Flow[In, Out, Mat]
Interleave is a deterministic merge of the given Sources with elements of this Flow.
Interleave is a deterministic merge of the given Sources with elements of this Flow. It first emits
segmentSize
number of elements from this flow to downstream, then - same amount forthat
source, then repeat process.If eagerClose is false and one of the upstreams complete the elements from the other upstream will continue passing through the interleave operator. If eagerClose is true and one of the upstream complete interleave will cancel the other upstream and complete itself.
If this Flow or Source gets upstream error - stream completes with failure.
Emits when element is available from the currently consumed upstream
Backpressures when downstream backpressures. Signal to current upstream, switch to next upstream when received
segmentSize
elementsCompletes when the Flow and given Source completes
Cancels when downstream cancels
- def interleaveMat[M, M2](that: Graph[SourceShape[Out], M], segmentSize: Int, eagerClose: Boolean, matF: Function2[Mat, M, M2]): Flow[In, Out, M2]
Interleave is a deterministic merge of the given Source with elements of this Flow.
Interleave is a deterministic merge of the given Source with elements of this Flow. It first emits
segmentSize
number of elements from this flow to downstream, then - same amount forthat
source, then repeat process.If eagerClose is false and one of the upstreams complete the elements from the other upstream will continue passing through the interleave operator. If eagerClose is true and one of the upstream complete interleave will cancel the other upstream and complete itself.
If this Flow or Source gets upstream error - stream completes with failure.
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.- See also
- def interleaveMat[M, M2](that: Graph[SourceShape[Out], M], segmentSize: Int, matF: Function2[Mat, M, M2]): Flow[In, Out, M2]
Interleave is a deterministic merge of the given Source with elements of this Flow.
Interleave is a deterministic merge of the given Source with elements of this Flow. It first emits
segmentSize
number of elements from this flow to downstream, then - same amount forthat
source, then repeat process.After one of upstreams is complete than all the rest elements will be emitted from the second one
If this Flow or Source gets upstream error - stream completes with failure.
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.- See also
- def intersperse(inject: Out): Flow[In, Out, Mat]
Intersperses stream with provided element, similar to how scala.collection.immutable.List.mkString injects a separator between a List's elements.
Intersperses stream with provided element, similar to how scala.collection.immutable.List.mkString injects a separator between a List's elements.
Additionally can inject start and end marker elements to stream.
Examples:
Source<Integer, ?> nums = Source.from(Arrays.asList(0, 1, 2, 3)); nums.intersperse(","); // 1 , 2 , 3 nums.intersperse("[", ",", "]"); // [ 1 , 2 , 3 ]
Emits when upstream emits (or before with the
start
element if provided)Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def intersperse(start: Out, inject: Out, end: Out): Flow[In, Out, Mat]
Intersperses stream with provided element, similar to how scala.collection.immutable.List.mkString injects a separator between a List's elements.
Intersperses stream with provided element, similar to how scala.collection.immutable.List.mkString injects a separator between a List's elements.
Additionally can inject start and end marker elements to stream.
Examples:
Source<Integer, ?> nums = Source.from(Arrays.asList(0, 1, 2, 3)); nums.intersperse(","); // 1 , 2 , 3 nums.intersperse("[", ",", "]"); // [ 1 , 2 , 3 ]
In case you want to only prepend or only append an element (yet still use the
intercept
feature to inject a separator between elements, you may want to use the following pattern instead of the 3-argument version of intersperse (See Source.concat for semantics details):Source.single(">> ").concat(flow.intersperse(",")) flow.intersperse(",").concat(Source.single("END"))
Emits when upstream emits (or before with the
start
element if provided)Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- def join[I2, O1, Mat2](bidi: Graph[BidiShape[Out, O1, I2, In], Mat2]): Flow[I2, O1, Mat]
Join this Flow to a BidiFlow to close off the “top” of the protocol stack:
Join this Flow to a BidiFlow to close off the “top” of the protocol stack:
+---------------------------+ | Resulting Flow | | | | +------+ +------+ | | | | ~Out~> | | ~~> O1 | | flow | | bidi | | | | | <~In~ | | <~~ I2 | +------+ +------+ | +---------------------------+
The materialized value of the combined Flow will be the materialized value of the current flow (ignoring the BidiFlow’s value), use joinMat if a different strategy is needed.
- def join[M](flow: Graph[FlowShape[Out, In], M]): RunnableGraph[Mat]
Join this Flow to another Flow, by cross connecting the inputs and outputs, creating a RunnableGraph.
Join this Flow to another Flow, by cross connecting the inputs and outputs, creating a RunnableGraph.
+------+ +-------+ | | ~Out~> | | | this | | other | | | <~In~ | | +------+ +-------+
The materialized value of the combined Flow will be the materialized value of the current flow (ignoring the other Flow’s value), use
joinMat
if a different strategy is needed.See also joinMat when access to materialized values of the parameter is needed.
- def joinMat[I2, O1, Mat2, M](bidi: Graph[BidiShape[Out, O1, I2, In], Mat2], combine: Function2[Mat, Mat2, M]): Flow[I2, O1, M]
Join this Flow to a BidiFlow to close off the “top” of the protocol stack:
Join this Flow to a BidiFlow to close off the “top” of the protocol stack:
+---------------------------+ | Resulting Flow | | | | +------+ +------+ | | | | ~Out~> | | ~~> O1 | | flow | | bidi | | | | | <~In~ | | <~~ I2 | +------+ +------+ | +---------------------------+
The
combine
function is used to compose the materialized values of this flow and that BidiFlow into the materialized value of the resulting Flow.It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.See also viaMat when access to materialized values of the parameter is needed.
- def joinMat[M, M2](flow: Graph[FlowShape[Out, In], M], combine: Function2[Mat, M, M2]): RunnableGraph[M2]
Join this Flow to another Flow, by cross connecting the inputs and outputs, creating a RunnableGraph
Join this Flow to another Flow, by cross connecting the inputs and outputs, creating a RunnableGraph
+------+ +-------+ | | ~Out~> | | | this | | other | | | <~In~ | | +------+ +-------+
The
combine
function is used to compose the materialized values of this flow and that Flow into the materialized value of the resulting Flow.It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values. - def keepAlive(maxIdle: Duration, injectedElem: Creator[Out]): Flow[In, Out, Mat]
Injects additional elements if upstream does not emit for a configured amount of time.
Injects additional elements if upstream does not emit for a configured amount of time. In other words, this operator attempts to maintains a base rate of emitted elements towards the downstream.
If the downstream backpressures then no element is injected until downstream demand arrives. Injected elements do not accumulate during this period.
Upstream elements are always preferred over injected elements.
Emits when upstream emits an element or if the upstream was idle for the configured period
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- Annotations
- @nowarn()
- def limit(n: Long): Flow[In, Out, Mat]
Ensure stream boundedness by limiting the number of elements from upstream.
Ensure stream boundedness by limiting the number of elements from upstream. If the number of incoming elements exceeds max, it will signal upstream failure
StreamLimitException
downstream.Due to input buffering some elements may have been requested from upstream publishers that will then not be processed downstream of this step.
The stream will be completed without producing any elements if
n
is zero or negative.Emits when the specified number of elements to take has not yet been reached
Backpressures when downstream backpressures
Completes when the defined number of elements has been taken or upstream completes
Errors when the total number of incoming element exceeds max
Cancels when the defined number of elements has been taken or downstream cancels
See also Flow.take, Flow.takeWithin, Flow.takeWhile
- def limitWeighted(n: Long, costFn: Function[Out, Long]): Flow[In, Out, Mat]
Ensure stream boundedness by evaluating the cost of incoming elements using a cost function.
Ensure stream boundedness by evaluating the cost of incoming elements using a cost function. Exactly how many elements will be allowed to travel downstream depends on the evaluated cost of each element. If the accumulated cost exceeds max, it will signal upstream failure
StreamLimitException
downstream.Due to input buffering some elements may have been requested from upstream publishers that will then not be processed downstream of this step.
The stream will be completed without producing any elements if
n
is zero or negative.Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when the specified number of elements to take has not yet been reached
Backpressures when downstream backpressures
Completes when the defined number of elements has been taken or upstream completes
Errors when when the accumulated cost exceeds max
Cancels when the defined number of elements has been taken or downstream cancels
See also Flow.take, Flow.takeWithin, Flow.takeWhile
- def log(name: String): Flow[In, Out, Mat]
Logs elements flowing through the stream as well as completion and erroring.
Logs elements flowing through the stream as well as completion and erroring.
By default element and completion signals are logged on debug level, and errors are logged on Error level. This can be adjusted according to your needs by providing a custom Attributes.LogLevels attribute on the given Flow.
Uses an internally created LoggingAdapter which uses
org.apache.pekko.stream.Log
as it's source (use this class to configure slf4j loggers).Emits when the mapping function returns an element
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def log(name: String, log: LoggingAdapter): Flow[In, Out, Mat]
Logs elements flowing through the stream as well as completion and erroring.
Logs elements flowing through the stream as well as completion and erroring.
By default element and completion signals are logged on debug level, and errors are logged on Error level. This can be adjusted according to your needs by providing a custom Attributes.LogLevels attribute on the given Flow:
Uses the given LoggingAdapter for logging.
Emits when the mapping function returns an element
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def log(name: String, extract: Function[Out, Any]): Flow[In, Out, Mat]
Logs elements flowing through the stream as well as completion and erroring.
Logs elements flowing through the stream as well as completion and erroring.
By default element and completion signals are logged on debug level, and errors are logged on Error level. This can be adjusted according to your needs by providing a custom Attributes.LogLevels attribute on the given Flow:
The
extract
function will be applied to each element before logging, so it is possible to log only those fields of a complex object flowing through this element.Uses an internally created LoggingAdapter which uses
org.apache.pekko.stream.Log
as it's source (use this class to configure slf4j loggers).Emits when the mapping function returns an element
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def log(name: String, extract: Function[Out, Any], log: LoggingAdapter): Flow[In, Out, Mat]
Logs elements flowing through the stream as well as completion and erroring.
Logs elements flowing through the stream as well as completion and erroring.
By default element and completion signals are logged on debug level, and errors are logged on Error level. This can be adjusted according to your needs by providing a custom Attributes.LogLevels attribute on the given Flow:
The
extract
function will be applied to each element before logging, so it is possible to log only those fields of a complex object flowing through this element.Uses the given LoggingAdapter for logging.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when the mapping function returns an element
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def logWithMarker(name: String, marker: Function[Out, LogMarker]): Flow[In, Out, Mat]
Logs elements flowing through the stream as well as completion and erroring.
Logs elements flowing through the stream as well as completion and erroring.
By default element and completion signals are logged on debug level, and errors are logged on Error level. This can be adjusted according to your needs by providing a custom Attributes.LogLevels attribute on the given Flow.
Uses an internally created MarkerLoggingAdapter which uses
org.apache.pekko.stream.Log
as it's source (use this class to configure slf4j loggers).Emits when the mapping function returns an element
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def logWithMarker(name: String, marker: Function[Out, LogMarker], log: MarkerLoggingAdapter): Flow[In, Out, Mat]
Logs elements flowing through the stream as well as completion and erroring.
Logs elements flowing through the stream as well as completion and erroring.
By default element and completion signals are logged on debug level, and errors are logged on Error level. This can be adjusted according to your needs by providing a custom Attributes.LogLevels attribute on the given Flow:
Uses the given MarkerLoggingAdapter for logging.
Emits when the mapping function returns an element
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def logWithMarker(name: String, marker: Function[Out, LogMarker], extract: Function[Out, Any]): Flow[In, Out, Mat]
Logs elements flowing through the stream as well as completion and erroring.
Logs elements flowing through the stream as well as completion and erroring.
By default element and completion signals are logged on debug level, and errors are logged on Error level. This can be adjusted according to your needs by providing a custom Attributes.LogLevels attribute on the given Flow:
The
extract
function will be applied to each element before logging, so it is possible to log only those fields of a complex object flowing through this element.Uses an internally created MarkerLoggingAdapter which uses
org.apache.pekko.stream.Log
as it's source (use this class to configure slf4j loggers).Emits when the mapping function returns an element
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def logWithMarker(name: String, marker: Function[Out, LogMarker], extract: Function[Out, Any], log: MarkerLoggingAdapter): Flow[In, Out, Mat]
Logs elements flowing through the stream as well as completion and erroring.
Logs elements flowing through the stream as well as completion and erroring.
By default element and completion signals are logged on debug level, and errors are logged on Error level. This can be adjusted according to your needs by providing a custom Attributes.LogLevels attribute on the given Flow:
The
extract
function will be applied to each element before logging, so it is possible to log only those fields of a complex object flowing through this element.Uses the given MarkerLoggingAdapter for logging.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when the mapping function returns an element
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def map[T](f: Function[Out, T]): Flow[In, T, Mat]
Transform this stream by applying the given function to each of the elements as they pass through this processing step.
Transform this stream by applying the given function to each of the elements as they pass through this processing step.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when the mapping function returns an element
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def mapAsync[T](parallelism: Int, f: Function[Out, CompletionStage[T]]): Flow[In, T, Mat]
Transform this stream by applying the given function to each of the elements as they pass through this processing step.
Transform this stream by applying the given function to each of the elements as they pass through this processing step. The function returns a
CompletionStage
and the value of that future will be emitted downstream. The number of CompletionStages that shall run in parallel is given as the first argument to
. These CompletionStages may complete in any order, but the elements that are emitted downstream are in the same order as received from upstream.mapAsync
If the function
f
throws an exception or if theCompletionStage
is completed with failure and the supervision decision is pekko.stream.Supervision#stop the stream will be completed with failure.If the function
f
throws an exception or if theCompletionStage
is completed with failure and the supervision decision is pekko.stream.Supervision#resume or pekko.stream.Supervision#restart or theCompletionStage
completed withnull
, the element is dropped and the stream continues.The function
f
is always invoked on the elements in the order they arrive.Emits when the CompletionStage returned by the provided function finishes for the next element in sequence
Backpressures when the number of CompletionStages reaches the configured parallelism and the downstream backpressures or the first future is not completed
Completes when upstream completes and all CompletionStages have been completed and all elements have been emitted
Cancels when downstream cancels
- See also
- def mapAsyncPartitioned[T, P](parallelism: Int, partitioner: Function[Out, P], f: Function2[Out, P, CompletionStage[T]]): Flow[In, T, Mat]
Transforms this stream.
Transforms this stream. Works very similarly to #mapAsync but with an additional partition step before the transform step. The transform function receives the an individual stream entry and the calculated partition value for that entry. The max parallelism of per partition is 1.
The function
partitioner
is always invoked on the elements in the order they arrive. The functionf
is always invoked on the elements which in the same partition in the order they arrive.If the function
partitioner
orf
throws an exception or if the CompletionStage is completed with failure and the supervision decision is pekko.stream.Supervision.Stop the stream will be completed with failure, otherwise the stream continues and the current element is dropped.Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when the Future returned by the provided function finishes for the next element in sequence
Backpressures when the number of futures reaches the configured parallelism and the downstream backpressures
Completes when upstream completes and all futures have been completed and all elements have been emitted
Cancels when downstream cancels
- Since
1.1.0
- See also
- def mapAsyncPartitionedUnordered[T, P](parallelism: Int, partitioner: Function[Out, P], f: Function2[Out, P, CompletionStage[T]]): Flow[In, T, Mat]
Transforms this stream.
Transforms this stream. Works very similarly to #mapAsyncUnordered but with an additional partition step before the transform step. The transform function receives the an individual stream entry and the calculated partition value for that entry.The max parallelism of per partition is 1.
The function
partitioner
is always invoked on the elements in the order they arrive. The functionf
is always invoked on the elements which in the same partition in the order they arrive.If the function
partitioner
orf
throws an exception or if the CompletionStage is completed with failure and the supervision decision is pekko.stream.Supervision.Stop the stream will be completed with failure, otherwise the stream continues and the current element is dropped.Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when the Future returned by the provided function finishes and downstream available.
Backpressures when the number of futures reaches the configured parallelism and the downstream backpressures
Completes when upstream completes and all futures have been completed and all elements have been emitted
Cancels when downstream cancels
- Since
1.1.0
- See also
- def mapAsyncUnordered[T](parallelism: Int, f: Function[Out, CompletionStage[T]]): Flow[In, T, Mat]
Transform this stream by applying the given function to each of the elements as they pass through this processing step.
Transform this stream by applying the given function to each of the elements as they pass through this processing step. The function returns a
CompletionStage
and the value of that future will be emitted downstream. The number of CompletionStages that shall run in parallel is given as the first argument to
. Each processed element will be emitted downstream as soon as it is ready, i.e. it is possible that the elements are not emitted downstream in the same order as received from upstream.mapAsyncUnordered
If the function
f
throws an exception or if theCompletionStage
is completed with failure and the supervision decision is pekko.stream.Supervision#stop the stream will be completed with failure.If the function
f
throws an exception or if theCompletionStage
is completed with failure and the supervision decision is pekko.stream.Supervision#resume or pekko.stream.Supervision#restart or theCompletionStage
completed withnull
, the element is dropped and the stream continues.The function
f
is always invoked on the elements in the order they arrive (even though the result of the futures returned byf
might be emitted in a different order).Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when any of the CompletionStages returned by the provided function complete
Backpressures when the number of CompletionStages reaches the configured parallelism and the downstream backpressures
Completes when upstream completes and all CompletionStages have been completed and all elements have been emitted
Cancels when downstream cancels
- See also
- def mapConcat[T](f: Function[Out, Iterable[T]]): Flow[In, T, Mat]
Transform each input element into an
Iterable
of output elements that is then flattened into the output stream.Transform each input element into an
Iterable
of output elements that is then flattened into the output stream.Make sure that the
Iterable
is immutable or at least not modified after being used as an output sequence. Otherwise the stream may fail withConcurrentModificationException
or other more subtle errors may occur.The returned
Iterable
MUST NOT containnull
values, as they are illegal as stream elements - according to the Reactive Streams specification.Emits when the mapping function returns an element or there are still remaining elements from the previously calculated collection
Backpressures when downstream backpressures or there are still remaining elements from the previously calculated collection
Completes when upstream completes and all remaining elements have been emitted
Cancels when downstream cancels
- def mapError[E <: Throwable](clazz: Class[E], f: Function[E, Throwable]): Flow[In, Out, Mat]
While similar to recover this operator can be used to transform an error signal to a different one *without* logging it as an error in the process.
While similar to recover this operator can be used to transform an error signal to a different one *without* logging it as an error in the process. So in that sense it is NOT exactly equivalent to
recover(t => throw t2)
since recover would log thet2
error.Since the underlying failure signal onError arrives out-of-band, it might jump over existing elements. This operator can recover the failure signal, but not the skipped elements, which will be dropped.
Similarly to recover throwing an exception inside
mapError
_will_ be logged.Emits when element is available from the upstream or upstream is failed and pf returns an element
Backpressures when downstream backpressures
Completes when upstream completes or upstream failed with exception pf can handle
Cancels when downstream cancels
- def mapError(pf: PartialFunction[Throwable, Throwable]): Flow[In, Out, Mat]
While similar to recover this operator can be used to transform an error signal to a different one *without* logging it as an error in the process.
While similar to recover this operator can be used to transform an error signal to a different one *without* logging it as an error in the process. So in that sense it is NOT exactly equivalent to
recover(t => throw t2)
since recover would log thet2
error.Since the underlying failure signal onError arrives out-of-band, it might jump over existing elements. This operator can recover the failure signal, but not the skipped elements, which will be dropped.
Similarly to recover throwing an exception inside
mapError
_will_ be logged.Emits when element is available from the upstream or upstream is failed and pf returns an element
Backpressures when downstream backpressures
Completes when upstream completes or upstream failed with exception pf can handle
Cancels when downstream cancels
- def mapMaterializedValue[Mat2](f: Function[Mat, Mat2]): Flow[In, Out, Mat2]
Transform only the materialized value of this Flow, leaving all other properties as they were.
- def mapWithResource[R <: AutoCloseable, T](create: Creator[R], f: Function2[R, Out, T]): Flow[In, T, Mat]
Transform each stream element with the help of an AutoCloseable resource and close it when the stream finishes or fails.
Transform each stream element with the help of an AutoCloseable resource and close it when the stream finishes or fails.
The resource creation function is invoked once when the stream is materialized and the returned resource is passed to the mapping function for mapping the first element. The mapping function returns a mapped element to emit downstream. The returned
T
MUST NOT benull
as it is illegal as stream element - according to the Reactive Streams specification.The AutoCloseable resource is closed only once when the upstream or downstream finishes or fails.
Early completion can be done with combination of the takeWhile operator.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
You can configure the default dispatcher for this Source by changing the
pekko.stream.materializer.blocking-io-dispatcher
or set it for a given Source by using ActorAttributes.Emits when the mapping function returns an element and downstream is ready to consume it
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- R
the type of the resource
- T
the type of the output elements
- create
function that creates the resource
- f
function that transforms the upstream element and the resource to output element
- Since
1.1.0
- def mapWithResource[R, T](create: Creator[R], f: Function2[R, Out, T], close: Function[R, Optional[T]]): Flow[In, T, Mat]
Transform each stream element with the help of a resource.
Transform each stream element with the help of a resource.
The resource creation function is invoked once when the stream is materialized and the returned resource is passed to the mapping function for mapping the first element. The mapping function returns a mapped element to emit downstream. The returned
T
MUST NOT benull
as it is illegal as stream element - according to the Reactive Streams specification.The
close
function is called only once when the upstream or downstream finishes or fails. You can do some clean-up here, and if the returned value is not empty, it will be emitted to the downstream if available, otherwise the value will be dropped.Early completion can be done with combination of the takeWhile operator.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
You can configure the default dispatcher for this Source by changing the
pekko.stream.materializer.blocking-io-dispatcher
or set it for a given Source by using ActorAttributes.Emits when the mapping function returns an element and downstream is ready to consume it
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- R
the type of the resource
- T
the type of the output elements
- create
function that creates the resource
- f
function that transforms the upstream element and the resource to output element
- close
function that closes the resource, optionally outputting a last element
- Since
1.1.0
- def merge(that: Graph[SourceShape[Out], _], eagerComplete: Boolean): Flow[In, Out, Mat]
Merge the given Source to this Flow, taking elements as they arrive from input streams, picking randomly when several elements ready.
Merge the given Source to this Flow, taking elements as they arrive from input streams, picking randomly when several elements ready.
Emits when one of the inputs has an element available
Backpressures when downstream backpressures
Completes when all upstreams complete (eagerComplete=false) or one upstream completes (eagerComplete=true), default value is
false
Cancels when downstream cancels
- def merge(that: Graph[SourceShape[Out], _]): Flow[In, Out, Mat]
Merge the given Source to this Flow, taking elements as they arrive from input streams, picking randomly when several elements ready.
- def mergeAll(those: List[_ <: Graph[SourceShape[Out], _]], eagerComplete: Boolean): Flow[In, Out, Mat]
Merge the given Sources to this Flow, taking elements as they arrive from input streams, picking randomly when several elements ready.
Merge the given Sources to this Flow, taking elements as they arrive from input streams, picking randomly when several elements ready.
Emits when one of the inputs has an element available
Backpressures when downstream backpressures
Completes when all upstreams complete (eagerComplete=false) or one upstream completes (eagerComplete=true), default value is
false
Cancels when downstream cancels
- def mergeLatest(that: Graph[SourceShape[Out], _], eagerComplete: Boolean): Flow[In, List[Out], Mat]
MergeLatest joins elements from N input streams into stream of lists of size N.
MergeLatest joins elements from N input streams into stream of lists of size N. i-th element in list is the latest emitted element from i-th input stream. MergeLatest emits list for each element emitted from some input stream, but only after each input stream emitted at least one element.
Emits when an element is available from some input and each input emits at least one element from stream start
Completes when all upstreams complete (eagerClose=false) or one upstream completes (eagerClose=true)
- def mergeLatestMat[Mat2, Mat3](that: Graph[SourceShape[Out], Mat2], eagerComplete: Boolean, matF: Function2[Mat, Mat2, Mat3]): Flow[In, List[Out], Mat3]
MergeLatest joins elements from N input streams into stream of lists of size N.
MergeLatest joins elements from N input streams into stream of lists of size N. i-th element in list is the latest emitted element from i-th input stream. MergeLatest emits list for each element emitted from some input stream, but only after each input stream emitted at least one element.
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values. - def mergeMat[M, M2](that: Graph[SourceShape[Out], M], matF: Function2[Mat, M, M2], eagerComplete: Boolean): Flow[In, Out, M2]
Merge the given Source to this Flow, taking elements as they arrive from input streams, picking randomly when several elements ready.
Merge the given Source to this Flow, taking elements as they arrive from input streams, picking randomly when several elements ready.
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.- See also
- def mergeMat[M, M2](that: Graph[SourceShape[Out], M], matF: Function2[Mat, M, M2]): Flow[In, Out, M2]
Merge the given Source to this Flow, taking elements as they arrive from input streams, picking randomly when several elements ready.
Merge the given Source to this Flow, taking elements as they arrive from input streams, picking randomly when several elements ready.
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.- See also
- def mergePreferred(that: Graph[SourceShape[Out], _], preferred: Boolean, eagerComplete: Boolean): Flow[In, Out, Mat]
Merge two sources.
Merge two sources. Prefer one source if both sources have elements ready.
emits when one of the inputs has an element available. If multiple have elements available, prefer the 'right' one when 'preferred' is 'true', or the 'left' one when 'preferred' is 'false'.
backpressures when downstream backpressures
completes when all upstreams complete (This behavior is changeable to completing when any upstream completes by setting
eagerComplete=true
.) - def mergePreferredMat[Mat2, Mat3](that: Graph[SourceShape[Out], Mat2], preferred: Boolean, eagerComplete: Boolean, matF: Function2[Mat, Mat2, Mat3]): Flow[In, Out, Mat3]
Merge two sources.
Merge two sources. Prefer one source if both sources have elements ready.
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values. - def mergePrioritized(that: Graph[SourceShape[Out], _], leftPriority: Int, rightPriority: Int, eagerComplete: Boolean): Flow[In, Out, Mat]
Merge two sources.
Merge two sources. Prefer the sources depending on the 'priority' parameters.
emits when one of the inputs has an element available, preferring inputs based on the 'priority' parameters if both have elements available
backpressures when downstream backpressures
completes when both upstreams complete (This behavior is changeable to completing when any upstream completes by setting
eagerComplete=true
.) - def mergePrioritizedMat[Mat2, Mat3](that: Graph[SourceShape[Out], Mat2], leftPriority: Int, rightPriority: Int, eagerComplete: Boolean, matF: Function2[Mat, Mat2, Mat3]): Flow[In, Out, Mat3]
Merge two sources.
Merge two sources. Prefer the sources depending on the 'priority' parameters.
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values. - def mergeSorted[M](that: Graph[SourceShape[Out], M], comp: Comparator[Out]): Flow[In, Out, Mat]
Merge the given Source to this Flow, taking elements as they arrive from input streams, picking always the smallest of the available elements (waiting for one element from each side to be available).
Merge the given Source to this Flow, taking elements as they arrive from input streams, picking always the smallest of the available elements (waiting for one element from each side to be available). This means that possible contiguity of the input streams is not exploited to avoid waiting for elements, this merge will block when one of the inputs does not have more elements (and does not complete).
Emits when all of the inputs have an element available
Backpressures when downstream backpressures
Completes when all upstreams complete
Cancels when downstream cancels
- def mergeSortedMat[Mat2, Mat3](that: Graph[SourceShape[Out], Mat2], comp: Comparator[Out], matF: Function2[Mat, Mat2, Mat3]): Flow[In, Out, Mat3]
Merge the given Source to this Flow, taking elements as they arrive from input streams, picking always the smallest of the available elements (waiting for one element from each side to be available).
Merge the given Source to this Flow, taking elements as they arrive from input streams, picking always the smallest of the available elements (waiting for one element from each side to be available). This means that possible contiguity of the input streams is not exploited to avoid waiting for elements, this merge will block when one of the inputs does not have more elements (and does not complete).
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.- See also
- def monitor(): Flow[In, Out, Pair[Mat, FlowMonitor[Out]]]
Materializes to
Pair<Mat, FlowMonitor<<Out>>
, which is unlike most other operators (!), in which usually the default materialized value keeping semantics is to keep the left value (by passingKeep.left()
to a*Mat
version of a method).Materializes to
Pair<Mat, FlowMonitor<<Out>>
, which is unlike most other operators (!), in which usually the default materialized value keeping semantics is to keep the left value (by passingKeep.left()
to a*Mat
version of a method). This operator is an exception from that rule and keeps both values since dropping its sole purpose is to introduce that materialized value.The
FlowMonitor[Out]
allows monitoring of the current flow. All events are propagated by the monitor unchanged. Note that the monitor inserts a memory barrier every time it processes an event, and may therefor affect performance. - def monitorMat[M](combine: Function2[Mat, FlowMonitor[Out], M]): Flow[In, Out, M]
Materializes to
FlowMonitor[Out]
that allows monitoring of the current flow.Materializes to
FlowMonitor[Out]
that allows monitoring of the current flow. All events are propagated by the monitor unchanged. Note that the monitor inserts a memory barrier every time it processes an event, and may therefor affect performance.The
combine
function is used to combine theFlowMonitor
with this flow's materialized value. - def named(name: String): Flow[In, Out, Mat]
Add a
attribute to this Flow.name
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @HotSpotIntrinsicCandidate() @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @HotSpotIntrinsicCandidate() @native()
- def onErrorComplete(predicate: Predicate[_ >: Throwable]): Flow[In, Out, Mat]
onErrorComplete allows to complete the stream when an upstream error occurs.
onErrorComplete allows to complete the stream when an upstream error occurs.
Since the underlying failure signal onError arrives out-of-band, it might jump over existing elements. This operator can recover the failure signal, but not the skipped elements, which will be dropped.
Emits when element is available from the upstream
Backpressures when downstream backpressures
Completes when upstream completes or failed with predicate return ture
Cancels when downstream cancels
- Since
1.1.0
- def onErrorComplete(clazz: Class[_ <: Throwable]): Flow[In, Out, Mat]
onErrorComplete allows to complete the stream when an upstream error occurs.
onErrorComplete allows to complete the stream when an upstream error occurs.
Since the underlying failure signal onError arrives out-of-band, it might jump over existing elements. This operator can recover the failure signal, but not the skipped elements, which will be dropped.
Emits when element is available from the upstream
Backpressures when downstream backpressures
Completes when upstream completes or failed with exception is an instance of the provided type
Cancels when downstream cancels
- Since
1.1.0
- def onErrorComplete(): Flow[In, Out, Mat]
onErrorComplete allows to complete the stream when an upstream error occurs.
onErrorComplete allows to complete the stream when an upstream error occurs.
Since the underlying failure signal onError arrives out-of-band, it might jump over existing elements. This operator can recover the failure signal, but not the skipped elements, which will be dropped.
Emits when element is available from the upstream
Backpressures when downstream backpressures
Completes when upstream completes or failed with exception is an instance of the provided type
Cancels when downstream cancels
- Since
1.1.0
- def orElse[M](secondary: Graph[SourceShape[Out], M]): Flow[In, Out, Mat]
Provides a secondary source that will be consumed if this source completes without any elements passing by.
Provides a secondary source that will be consumed if this source completes without any elements passing by. As soon as the first element comes through this stream, the alternative will be cancelled.
Note that this Flow will be materialized together with the Source and just kept from producing elements by asserting back-pressure until its time comes or it gets cancelled.
On errors the operator is failed regardless of source of the error.
Emits when element is available from first stream or first stream closed without emitting any elements and an element is available from the second stream
Backpressures when downstream backpressures
Completes when the primary stream completes after emitting at least one element, when the primary stream completes without emitting and the secondary stream already has completed or when the secondary stream completes
Cancels when downstream cancels and additionally the alternative is cancelled as soon as an element passes by from this stream.
- def orElseMat[M2, M3](secondary: Graph[SourceShape[Out], M2], matF: Function2[Mat, M2, M3]): Flow[In, Out, M3]
Provides a secondary source that will be consumed if this source completes without any elements passing by.
Provides a secondary source that will be consumed if this source completes without any elements passing by. As soon as the first element comes through this stream, the alternative will be cancelled.
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.- See also
- def preMaterialize(materializer: Materializer): Pair[Mat, Flow[In, Out, NotUsed]]
Materializes this Flow, immediately returning (1) its materialized value, and (2) a newly materialized Flow.
- def preMaterialize(systemProvider: ClassicActorSystemProvider): Pair[Mat, Flow[In, Out, NotUsed]]
Materializes this Flow, immediately returning (1) its materialized value, and (2) a newly materialized Flow.
- def prefixAndTail(n: Int): Flow[In, Pair[List[Out], Source[Out, NotUsed]], Mat]
Takes up to
n
elements from the stream (less thann
if the upstream completes before emittingn
elements) and returns a pair containing a strict sequence of the taken element and a stream representing the remaining elements.Takes up to
n
elements from the stream (less thann
if the upstream completes before emittingn
elements) and returns a pair containing a strict sequence of the taken element and a stream representing the remaining elements. If n is zero or negative, then this will return a pair of an empty collection and a stream containing the whole upstream unchanged.In case of an upstream error, depending on the current state
- the master stream signals the error if less than
n
elements have been seen, and therefore the substream has not yet been emitted - the tail substream signals the error after the prefix and tail has been emitted by the main stream (at that point the main stream has already completed)
Emits when the configured number of prefix elements are available. Emits this prefix, and the rest as a substream
Backpressures when downstream backpressures or substream backpressures
Completes when prefix elements have been consumed and substream has been consumed
Cancels when downstream cancels or substream cancels
- the master stream signals the error if less than
- def prepend[M](that: Graph[SourceShape[Out], M]): Flow[In, Out, Mat]
Prepend the given Source to this Flow, meaning that before elements are generated from this Flow, the Source's elements will be produced until it is exhausted, at which point Flow elements will start being produced.
Prepend the given Source to this Flow, meaning that before elements are generated from this Flow, the Source's elements will be produced until it is exhausted, at which point Flow elements will start being produced.
Note that the Source is materialized together with this Flow and is "detached" meaning in effect behave as a one element buffer in front of both the sources, that eagerly demands an element on start (so it can not be combined with
Source.lazy
to defer materialization ofthat
).This flow will then be kept from producing elements by asserting back-pressure until its time comes.
When needing a prepend operator that is not detached use #prependLazy
Emits when element is available from the given Source or from current stream when the Source is completed
Backpressures when downstream backpressures
Completes when this Flow completes
Cancels when downstream cancels
- def prependLazy[M](that: Graph[SourceShape[Out], M]): Flow[In, Out, Mat]
Prepend the given Source to this Flow, meaning that before elements are generated from this Flow, the Source's elements will be produced until it is exhausted, at which point Flow elements will start being produced.
Prepend the given Source to this Flow, meaning that before elements are generated from this Flow, the Source's elements will be produced until it is exhausted, at which point Flow elements will start being produced.
Note that the Source is materialized together with this Flow and will then be kept from producing elements by asserting back-pressure until its time comes.
When needing a prepend operator that is also detached use #prepend
If the given Source gets upstream error - no elements from this Flow will be pulled.
Emits when element is available from the given Source or from current stream when the Source is completed
Backpressures when downstream backpressures
Completes when this Flow completes
Cancels when downstream cancels
- def prependLazyMat[M, M2](that: Graph[SourceShape[Out], M], matF: Function2[Mat, M, M2]): Flow[In, Out, M2]
Prepend the given Source to this Flow, meaning that before elements are generated from this Flow, the Source's elements will be produced until it is exhausted, at which point Flow elements will start being produced.
Prepend the given Source to this Flow, meaning that before elements are generated from this Flow, the Source's elements will be produced until it is exhausted, at which point Flow elements will start being produced.
Note that the Source is materialized together with this Flow.
This flow will then be kept from producing elements by asserting back-pressure until its time comes.
When needing a prepend operator that is detached use #prependMat
- See also
#prependLazy. It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.
- def prependMat[M, M2](that: Graph[SourceShape[Out], M], matF: Function2[Mat, M, M2]): Flow[In, Out, M2]
Prepend the given Source to this Flow, meaning that before elements are generated from this Flow, the Source's elements will be produced until it is exhausted, at which point Flow elements will start being produced.
Prepend the given Source to this Flow, meaning that before elements are generated from this Flow, the Source's elements will be produced until it is exhausted, at which point Flow elements will start being produced.
Note that this Flow will be materialized together with the Source and just kept from producing elements by asserting back-pressure until its time comes.
When needing a prepend operator that is not detached use #prependLazyMat
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.- See also
- def recover(clazz: Class[_ <: Throwable], supplier: Supplier[Out]): Flow[In, Out, Mat]
Recover allows to send last element on failure and gracefully complete the stream Since the underlying failure signal onError arrives out-of-band, it might jump over existing elements.
Recover allows to send last element on failure and gracefully complete the stream Since the underlying failure signal onError arrives out-of-band, it might jump over existing elements. This operator can recover the failure signal, but not the skipped elements, which will be dropped.
Throwing an exception inside
recover
_will_ be logged on ERROR level automatically.Emits when element is available from the upstream or upstream is failed and pf returns an element
Backpressures when downstream backpressures
Completes when upstream completes or upstream failed with exception pf can handle
Cancels when downstream cancels
- def recover(pf: PartialFunction[Throwable, Out]): Flow[In, Out, Mat]
Recover allows to send last element on failure and gracefully complete the stream Since the underlying failure signal onError arrives out-of-band, it might jump over existing elements.
Recover allows to send last element on failure and gracefully complete the stream Since the underlying failure signal onError arrives out-of-band, it might jump over existing elements. This operator can recover the failure signal, but not the skipped elements, which will be dropped.
Throwing an exception inside
recover
_will_ be logged on ERROR level automatically.Emits when element is available from the upstream or upstream is failed and pf returns an element
Backpressures when downstream backpressures
Completes when upstream completes or upstream failed with exception pf can handle
Cancels when downstream cancels
- def recoverWith(pf: PartialFunction[Throwable, _ <: Graph[SourceShape[Out], NotUsed]]): Flow[In, Out, Mat]
RecoverWith allows to switch to alternative Source on flow failure.
RecoverWith allows to switch to alternative Source on flow failure. It will stay in effect after a failure has been recovered so that each time there is a failure it is fed into the
pf
and a new Source may be materialized.Since the underlying failure signal onError arrives out-of-band, it might jump over existing elements. This operator can recover the failure signal, but not the skipped elements, which will be dropped.
Throwing an exception inside
recoverWith
_will_ be logged on ERROR level automatically.Emits when element is available from the upstream or upstream is failed and element is available from alternative Source
Backpressures when downstream backpressures
Completes when upstream completes or upstream failed with exception pf can handle
Cancels when downstream cancels
- def recoverWithRetries(attempts: Int, clazz: Class[_ <: Throwable], supplier: Supplier[Graph[SourceShape[Out], NotUsed]]): Flow[In, Out, Mat]
RecoverWithRetries allows to switch to alternative Source on flow failure.
RecoverWithRetries allows to switch to alternative Source on flow failure. It will stay in effect after a failure has been recovered up to
attempts
number of times so that each time there is a failure it is fed into thepf
and a new Source may be materialized. Note that if you pass in 0, this won't attempt to recover at all.A negative
attempts
number is interpreted as "infinite", which results in the exact same behavior asrecoverWith
.Since the underlying failure signal onError arrives out-of-band, it might jump over existing elements. This operator can recover the failure signal, but not the skipped elements, which will be dropped.
Throwing an exception inside
recoverWithRetries
_will_ be logged on ERROR level automatically.Emits when element is available from the upstream or upstream is failed and element is available from alternative Source
Backpressures when downstream backpressures
Completes when upstream completes or upstream failed with exception pf can handle
Cancels when downstream cancels
- attempts
Maximum number of retries or -1 to retry indefinitely
- clazz
the class object of the failure cause
- supplier
supply the new Source to be materialized
- def recoverWithRetries(attempts: Int, pf: PartialFunction[Throwable, Graph[SourceShape[Out], NotUsed]]): Flow[In, Out, Mat]
RecoverWithRetries allows to switch to alternative Source on flow failure.
RecoverWithRetries allows to switch to alternative Source on flow failure. It will stay in effect after a failure has been recovered up to
attempts
number of times so that each time there is a failure it is fed into thepf
and a new Source may be materialized. Note that if you pass in 0, this won't attempt to recover at all.A negative
attempts
number is interpreted as "infinite", which results in the exact same behavior asrecoverWith
.Since the underlying failure signal onError arrives out-of-band, it might jump over existing elements. This operator can recover the failure signal, but not the skipped elements, which will be dropped.
Throwing an exception inside
recoverWithRetries
_will_ be logged on ERROR level automatically.Emits when element is available from the upstream or upstream is failed and element is available from alternative Source
Backpressures when downstream backpressures
Completes when upstream completes or upstream failed with exception pf can handle
Cancels when downstream cancels
- attempts
Maximum number of retries or -1 to retry indefinitely
- pf
Receives the failure cause and returns the new Source to be materialized if any
- def reduce(f: Function2[Out, Out, Out]): Flow[In, Out, Mat]
Similar to
fold
but uses first element as zero element.Similar to
fold
but uses first element as zero element. Applies the given function towards its current and next value, yielding the next current value.If the stream is empty (i.e. completes before signalling any elements), the reduce operator will fail its downstream with a NoSuchElementException, which is semantically in-line with that Scala's standard library collections do in such situations.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when upstream completes
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def runWith[T, U](source: Graph[SourceShape[In], T], sink: Graph[SinkShape[Out], U], materializer: Materializer): Pair[T, U]
Connect the
Source
to thisFlow
and then connect it to theSink
and run it.Connect the
Source
to thisFlow
and then connect it to theSink
and run it.The returned tuple contains the materialized values of the
Source
andSink
, e.g. theSubscriber
of aSource.asSubscriber
andPublisher
of aSink.asPublisher
.Prefer the method taking an ActorSystem unless you have special requirements.
- T
materialized type of given Source
- U
materialized type of given Sink
- def runWith[T, U](source: Graph[SourceShape[In], T], sink: Graph[SinkShape[Out], U], systemProvider: ClassicActorSystemProvider): Pair[T, U]
Connect the
Source
to thisFlow
and then connect it to theSink
and run it.Connect the
Source
to thisFlow
and then connect it to theSink
and run it.The returned tuple contains the materialized values of the
Source
andSink
, e.g. theSubscriber
of aSource.asSubscriber
andPublisher
of aSink.asPublisher
.- T
materialized type of given Source
- U
materialized type of given Sink
- def scan[T](zero: T, f: Function2[T, Out, T]): Flow[In, T, Mat]
Similar to
fold
but is not a terminal operation, emits its current value which starts atzero
and then applies the current and next value to the given functionf
, emitting the next current value.Similar to
fold
but is not a terminal operation, emits its current value which starts atzero
and then applies the current and next value to the given functionf
, emitting the next current value.If the function
f
throws an exception and the supervision decision is pekko.stream.Supervision#restart current value starts atzero
again the stream will continue.Adheres to the ActorAttributes.SupervisionStrategy attribute.
Note that the
zero
value must be immutable.Emits when the function scanning the element returns a new element
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def scanAsync[T](zero: T, f: Function2[T, Out, CompletionStage[T]]): Flow[In, T, Mat]
Similar to
scan
but with an asynchronous function, emits its current value which starts atzero
and then applies the current and next value to the given functionf
, emitting aFuture
that resolves to the next current value.Similar to
scan
but with an asynchronous function, emits its current value which starts atzero
and then applies the current and next value to the given functionf
, emitting aFuture
that resolves to the next current value.If the function
f
throws an exception and the supervision decision is pekko.stream.Supervision.Restart current value starts atzero
again the stream will continue.If the function
f
throws an exception and the supervision decision is pekko.stream.Supervision.Resume current value starts at the previous current value, or zero when it doesn't have one, and the stream will continue.Adheres to the ActorAttributes.SupervisionStrategy attribute.
Note that the
zero
value must be immutable.Emits when the future returned by f
completes
Backpressures when downstream backpressures
Completes when upstream completes and the last future returned by
f
completesCancels when downstream cancels
See also #scan
- def shape: FlowShape[In, Out]
The shape of a graph is all that is externally visible: its inlets and outlets.
- def sliding(n: Int, step: Int = 1): Flow[In, List[Out], Mat]
Apply a sliding window over the stream and return the windows as groups of elements, with the last group possibly smaller than requested due to end-of-stream.
Apply a sliding window over the stream and return the windows as groups of elements, with the last group possibly smaller than requested due to end-of-stream.
n
must be positive, otherwise IllegalArgumentException is thrown.step
must be positive, otherwise IllegalArgumentException is thrown.Emits when enough elements have been collected within the window or upstream completed
Backpressures when a window has been assembled and downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def splitAfter(p: Predicate[Out]): SubFlow[In, Out, Mat]
This operation applies the given predicate to all incoming elements and emits them to a stream of output streams.
This operation applies the given predicate to all incoming elements and emits them to a stream of output streams. It *ends* the current substream when the predicate is true. This means that for the following series of predicate values, three substreams will be produced with lengths 2, 2, and 3:
false, true, // elements go into first substream false, true, // elements go into second substream false, false, true // elements go into third substream
The object returned from this method is not a normal Flow, it is a SubFlow. This means that after this operator all transformations are applied to all encountered substreams in the same fashion. Substream mode is exited either by closing the substream (i.e. connecting it to a Sink) or by merging the substreams back together; see the
to
andmergeBack
methods on SubFlow for more information.It is important to note that the substreams also propagate back-pressure as any other stream, which means that blocking one substream will block the
splitAfter
operator itself—and thereby all substreams—once all internal or explicit buffers are filled.If the split predicate
p
throws an exception and the supervision decision is pekko.stream.Supervision.Stop the stream and substreams will be completed with failure.If the split predicate
p
throws an exception and the supervision decision is pekko.stream.Supervision.Resume or pekko.stream.Supervision.Restart the element is dropped and the stream and substreams continue.Emits when an element passes through. When the provided predicate is true it emits the element and opens a new substream for subsequent element
Backpressures when there is an element pending for the next substream, but the previous is not fully consumed yet, or the substream backpressures
Completes when upstream completes
Cancels when downstream cancels and substreams cancel on
SubstreamCancelStrategy.drain
, downstream cancels or any substream cancels onSubstreamCancelStrategy.propagate
See also Flow.splitWhen.
- def splitWhen(p: Predicate[Out]): SubFlow[In, Out, Mat]
This operation applies the given predicate to all incoming elements and emits them to a stream of output streams, always beginning a new one with the current element if the given predicate returns true for it.
This operation applies the given predicate to all incoming elements and emits them to a stream of output streams, always beginning a new one with the current element if the given predicate returns true for it. This means that for the following series of predicate values, three substreams will be produced with lengths 1, 2, and 3:
false, // element goes into first substream true, false, // elements go into second substream true, false, false // elements go into third substream
In case the *first* element of the stream matches the predicate, the first substream emitted by splitWhen will start from that element. For example:
true, false, false // first substream starts from the split-by element true, false // subsequent substreams operate the same way
The object returned from this method is not a normal Flow, it is a SubFlow. This means that after this operator all transformations are applied to all encountered substreams in the same fashion. Substream mode is exited either by closing the substream (i.e. connecting it to a Sink) or by merging the substreams back together; see the
to
andmergeBack
methods on SubFlow for more information.It is important to note that the substreams also propagate back-pressure as any other stream, which means that blocking one substream will block the
splitWhen
operator itself—and thereby all substreams—once all internal or explicit buffers are filled.If the split predicate
p
throws an exception and the supervision decision is pekko.stream.Supervision#stop the stream and substreams will be completed with failure.If the split predicate
p
throws an exception and the supervision decision is pekko.stream.Supervision#resume or pekko.stream.Supervision#restart the element is dropped and the stream and substreams continue.Emits when an element for which the provided predicate is true, opening and emitting a new substream for subsequent element
Backpressures when there is an element pending for the next substream, but the previous is not fully consumed yet, or the substream backpressures
Completes when upstream completes
Cancels when downstream cancels and substreams cancel on
SubstreamCancelStrategy.drain()
, downstream cancels or any substream cancels onSubstreamCancelStrategy.propagate()
See also Flow.splitAfter.
- def statefulMap[S, T](create: Creator[S], f: Function2[S, Out, Pair[S, T]], onComplete: Function[S, Optional[T]]): Flow[In, T, Mat]
Transform each stream element with the help of a state.
Transform each stream element with the help of a state.
The state creation function is invoked once when the stream is materialized and the returned state is passed to the mapping function for mapping the first element. The mapping function returns a mapped element to emit downstream and a state to pass to the next mapping function. The state can be the same for each mapping return, be a new immutable state but it is also safe to use a mutable state. The returned
T
MUST NOT benull
as it is illegal as stream element - according to the Reactive Streams specification.For stateless variant see map.
The
onComplete
function is called only once when the upstream or downstream finished, You can do some clean-up here, and if the returned value is not empty, it will be emitted to the downstream if available, otherwise the value will be dropped.Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when the mapping function returns an element and downstream is ready to consume it
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- S
the type of the state
- T
the type of the output elements
- create
a function that creates the initial state
- f
a function that transforms the upstream element and the state into a pair of next state and output element
- onComplete
a function that transforms the ongoing state into an optional output element
- def statefulMapConcat[T](f: Creator[Function[Out, Iterable[T]]]): Flow[In, T, Mat]
Transform each input element into an
Iterable
of output elements that is then flattened into the output stream.Transform each input element into an
Iterable
of output elements that is then flattened into the output stream. The transformation is meant to be stateful, which is enabled by creating the transformation function anew for every materialization — the returned function will typically close over mutable objects to store state between invocations. For the stateless variant see #mapConcat.Make sure that the
Iterable
is immutable or at least not modified after being used as an output sequence. Otherwise the stream may fail withConcurrentModificationException
or other more subtle errors may occur.The returned
Iterable
MUST NOT containnull
values, as they are illegal as stream elements - according to the Reactive Streams specification.This operator doesn't handle upstream's completion signal since the state kept in the closure can be lost. Use FlowOps.statefulMap instead.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when the mapping function returns an element or there are still remaining elements from the previously calculated collection
Backpressures when downstream backpressures or there are still remaining elements from the previously calculated collection
Completes when upstream completes and all remaining elements has been emitted
Cancels when downstream cancels
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def take(n: Long): Flow[In, Out, Mat]
Terminate processing (and cancel the upstream publisher) after the given number of elements.
Terminate processing (and cancel the upstream publisher) after the given number of elements. Due to input buffering some elements may have been requested from upstream publishers that will then not be processed downstream of this step.
The stream will be completed without producing any elements if
n
is zero or negative.Emits when the specified number of elements to take has not yet been reached
Backpressures when downstream backpressures
Completes when the defined number of elements has been taken or upstream completes
Cancels when the defined number of elements has been taken or downstream cancels
See also Flow.limit, Flow.limitWeighted
- def takeWhile(p: Predicate[Out]): Flow[In, Out, Mat]
Terminate processing (and cancel the upstream publisher) after predicate returns false for the first time.
Terminate processing (and cancel the upstream publisher) after predicate returns false for the first time. When inclusive is
true
, include the element for which the predicate returnedfalse
. Due to input buffering some elements may have been requested from upstream publishers that will then not be processed downstream of this step.The stream will be completed without producing any elements if predicate is false for the first stream element.
Emits when the predicate is true
Backpressures when downstream backpressures
Completes when predicate returned false (or 1 after predicate returns false if
inclusive
or upstream completesCancels when predicate returned false or downstream cancels
See also Flow.limit, Flow.limitWeighted
- def takeWhile(p: Predicate[Out], inclusive: Boolean): Flow[In, Out, Mat]
Terminate processing (and cancel the upstream publisher) after predicate returns false for the first time.
Terminate processing (and cancel the upstream publisher) after predicate returns false for the first time. When inclusive is
true
, include the element for which the predicate returnedfalse
. Due to input buffering some elements may have been requested from upstream publishers that will then not be processed downstream of this step.The stream will be completed without producing any elements if predicate is false for the first stream element.
Adheres to the ActorAttributes.SupervisionStrategy attribute.
Emits when the predicate is true
Backpressures when downstream backpressures
Completes when predicate returned false (or 1 after predicate returns false if
inclusive
or upstream completesCancels when predicate returned false or downstream cancels
See also Flow.limit, Flow.limitWeighted
- def takeWithin(duration: Duration): Flow[In, Out, Mat]
Terminate processing (and cancel the upstream publisher) after the given duration.
Terminate processing (and cancel the upstream publisher) after the given duration. Due to input buffering some elements may have been requested from upstream publishers that will then not be processed downstream of this step.
Note that this can be combined with #take to limit the number of elements within the duration.
Emits when an upstream element arrives
Backpressures when downstream backpressures
Completes when upstream completes or timer fires
Cancels when downstream cancels or timer fires
See also Flow.limit, Flow.limitWeighted
- Annotations
- @nowarn()
- def throttle(cost: Int, per: Duration, maximumBurst: Int, costCalculation: Function[Out, Integer], mode: ThrottleMode): Flow[In, Out, Mat]
Sends elements downstream with speed limited to
cost/per
.Sends elements downstream with speed limited to
cost/per
. Cost is calculating for each element individually by callingcalculateCost
function. This operator works for streams when elements have different cost(length). Streams ofByteString
for example.Throttle implements the token bucket model. There is a bucket with a given token capacity (burst size or maximumBurst). Tokens drops into the bucket at a given rate and can be
spared
for later use up to bucket capacity to allow some burstiness. Whenever stream wants to send an element, it takes as many tokens from the bucket as element costs. If there isn't any, throttle waits until the bucket accumulates enough tokens. Elements that costs more than the allowed burst will be delayed proportionally to their cost minus available tokens, meeting the target rate. Bucket is full when stream just materialized and started.Parameter
mode
manages behavior when upstream is faster than throttle rate:- pekko.stream.ThrottleMode.Shaping makes pauses before emitting messages to meet throttle rate
- pekko.stream.ThrottleMode.Enforcing fails with exception when upstream is faster than throttle rate. Enforcing cannot emit elements that cost more than the maximumBurst
It is recommended to use non-zero burst sizes as they improve both performance and throttling precision by allowing the implementation to avoid using the scheduler when input rates fall below the enforced limit and to reduce most of the inaccuracy caused by the scheduler resolution (which is in the range of milliseconds).
WARNING: Be aware that throttle is using scheduler to slow down the stream. This scheduler has minimal time of triggering next push. Consequently it will slow down the stream as it has minimal pause for emitting. This can happen in case burst is 0 and speed is higher than 30 events per second. You need to increase the
maximumBurst
if elements arrive with small interval (30 milliseconds or less). Use the overloadedthrottle
method withoutmaximumBurst
parameter to automatically calculate themaximumBurst
based on the given rate (cost/per
). In other words the throttler always enforces the rate limit whenmaximumBurst
parameter is given, but in certain cases (mostly due to limited scheduler resolution) it enforces a tighter bound than what was prescribed.Emits when upstream emits an element and configured time per each element elapsed
Backpressures when downstream backpressures or the incoming rate is higher than the speed limit
Completes when upstream completes
Cancels when downstream cancels
- def throttle(cost: Int, per: Duration, costCalculation: Function[Out, Integer]): Flow[In, Out, Mat]
Sends elements downstream with speed limited to
cost/per
.Sends elements downstream with speed limited to
cost/per
. Cost is calculating for each element individually by callingcalculateCost
function. This operator works for streams when elements have different cost(length). Streams ofByteString
for example.Throttle implements the token bucket model. There is a bucket with a given token capacity (burst size). Tokens drops into the bucket at a given rate and can be
spared
for later use up to bucket capacity to allow some burstiness. Whenever stream wants to send an element, it takes as many tokens from the bucket as element costs. If there isn't any, throttle waits until the bucket accumulates enough tokens. Elements that costs more than the allowed burst will be delayed proportionally to their cost minus available tokens, meeting the target rate. Bucket is full when stream just materialized and started.The burst size is calculated based on the given rate (
cost/per
) as 0.1 * rate, for example: - rate < 20/second => burst size 1 - rate 20/second => burst size 2 - rate 100/second => burst size 10 - rate 200/second => burst size 20The throttle
mode
is pekko.stream.ThrottleMode.Shaping, which makes pauses before emitting messages to meet throttle rate.Emits when upstream emits an element and configured time per each element elapsed
Backpressures when downstream backpressures or the incoming rate is higher than the speed limit
Completes when upstream completes
Cancels when downstream cancels
- def throttle(elements: Int, per: Duration, maximumBurst: Int, mode: ThrottleMode): Flow[In, Out, Mat]
Sends elements downstream with speed limited to
elements/per
.Sends elements downstream with speed limited to
elements/per
. In other words, this operator set the maximum rate for emitting messages. This operator works for streams where all elements have the same cost or length.Throttle implements the token bucket model. There is a bucket with a given token capacity (burst size or maximumBurst). Tokens drops into the bucket at a given rate and can be
spared
for later use up to bucket capacity to allow some burstiness. Whenever stream wants to send an element, it takes as many tokens from the bucket as element costs. If there isn't any, throttle waits until the bucket accumulates enough tokens. Elements that costs more than the allowed burst will be delayed proportionally to their cost minus available tokens, meeting the target rate. Bucket is full when stream just materialized and started.Parameter
mode
manages behavior when upstream is faster than throttle rate:- pekko.stream.ThrottleMode.Shaping makes pauses before emitting messages to meet throttle rate
- pekko.stream.ThrottleMode.Enforcing fails with exception when upstream is faster than throttle rate
It is recommended to use non-zero burst sizes as they improve both performance and throttling precision by allowing the implementation to avoid using the scheduler when input rates fall below the enforced limit and to reduce most of the inaccuracy caused by the scheduler resolution (which is in the range of milliseconds).
WARNING: Be aware that throttle is using scheduler to slow down the stream. This scheduler has minimal time of triggering next push. Consequently it will slow down the stream as it has minimal pause for emitting. This can happen in case burst is 0 and speed is higher than 30 events per second. You need to increase the
maximumBurst
if elements arrive with small interval (30 milliseconds or less). Use the overloadedthrottle
method withoutmaximumBurst
parameter to automatically calculate themaximumBurst
based on the given rate (cost/per
). In other words the throttler always enforces the rate limit whenmaximumBurst
parameter is given, but in certain cases (mostly due to limited scheduler resolution) it enforces a tighter bound than what was prescribed.Emits when upstream emits an element and configured time per each element elapsed
Backpressures when downstream backpressures or the incoming rate is higher than the speed limit
Completes when upstream completes
Cancels when downstream cancels
- def throttle(elements: Int, per: Duration): Flow[In, Out, Mat]
Sends elements downstream with speed limited to
elements/per
.Sends elements downstream with speed limited to
elements/per
. In other words, this operator set the maximum rate for emitting messages. This operator works for streams where all elements have the same cost or length.Throttle implements the token bucket model. There is a bucket with a given token capacity (burst size). Tokens drops into the bucket at a given rate and can be
spared
for later use up to bucket capacity to allow some burstiness. Whenever stream wants to send an element, it takes as many tokens from the bucket as element costs. If there isn't any, throttle waits until the bucket accumulates enough tokens. Elements that costs more than the allowed burst will be delayed proportionally to their cost minus available tokens, meeting the target rate. Bucket is full when stream just materialized and started.The burst size is calculated based on the given rate (
cost/per
) as 0.1 * rate, for example: - rate < 20/second => burst size 1 - rate 20/second => burst size 2 - rate 100/second => burst size 10 - rate 200/second => burst size 20The throttle
mode
is pekko.stream.ThrottleMode.Shaping, which makes pauses before emitting messages to meet throttle rate.Emits when upstream emits an element and configured time per each element elapsed
Backpressures when downstream backpressures or the incoming rate is higher than the speed limit
Completes when upstream completes
Cancels when downstream cancels
- def to(sink: Graph[SinkShape[Out], _]): Sink[In, Mat]
Connect this Flow to a Sink, concatenating the processing steps of both.
Connect this Flow to a Sink, concatenating the processing steps of both.
+------------------------------+ | Resulting Sink[In, Mat] | | | | +------+ +------+ | | | | | | | In ~~> | flow | ~~Out~~> | sink | | | | Mat| | M| | | +------+ +------+ | +------------------------------+
The materialized value of the combined Sink will be the materialized value of the current flow (ignoring the given Sink’s value), use
toMat
if a different strategy is needed.See also toMat when access to materialized values of the parameter is needed.
- def toMat[M, M2](sink: Graph[SinkShape[Out], M], combine: Function2[Mat, M, M2]): Sink[In, M2]
Connect this Flow to a Sink, concatenating the processing steps of both.
Connect this Flow to a Sink, concatenating the processing steps of both.
+----------------------------+ | Resulting Sink[In, M2] | | | | +------+ +------+ | | | | | | | In ~~> | flow | ~Out~> | sink | | | | Mat| | M| | | +------+ +------+ | +----------------------------+
The
combine
function is used to compose the materialized values of this flow and that Sink into the materialized value of the resulting Sink.It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values. - def toProcessor: RunnableGraph[Processor[In, Out]]
Converts this Flow to a RunnableGraph that materializes to a Reactive Streams org.reactivestreams.Processor which implements the operations encapsulated by this Flow.
Converts this Flow to a RunnableGraph that materializes to a Reactive Streams org.reactivestreams.Processor which implements the operations encapsulated by this Flow. Every materialization results in a new Processor instance, i.e. the returned RunnableGraph is reusable.
- returns
A RunnableGraph that materializes to a Processor when run() is called on it.
- def toString(): String
- Definition Classes
- Flow → AnyRef → Any
- def traversalBuilder: LinearTraversalBuilder
INTERNAL API.
- def via[T, M](flow: Graph[FlowShape[Out, T], M]): Flow[In, T, Mat]
Transform this Flow by appending the given processing steps.
Transform this Flow by appending the given processing steps.
+---------------------------------+ | Resulting Flow[In, T, Mat] | | | | +------+ +------+ | | | | | | | In ~~> | this | ~~Out~~> | flow | ~~> T | | Mat| | M| | | +------+ +------+ | +---------------------------------+
The materialized value of the combined Flow will be the materialized value of the current flow (ignoring the other Flow’s value), use
viaMat
if a different strategy is needed.See also viaMat when access to materialized values of the parameter is needed.
- def viaMat[T, M, M2](flow: Graph[FlowShape[Out, T], M], combine: Function2[Mat, M, M2]): Flow[In, T, M2]
Transform this Flow by appending the given processing steps.
Transform this Flow by appending the given processing steps.
+---------------------------------+ | Resulting Flow[In, T, M2] | | | | +------+ +------+ | | | | | | | In ~~> | this | ~~Out~~> | flow | ~~> T | | Mat| | M| | | +------+ +------+ | +---------------------------------+
The
combine
function is used to compose the materialized values of this flow and that flow into the materialized value of the resulting Flow.It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values. - final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- def watch(ref: ActorRef): Flow[In, Out, Mat]
The operator fails with an pekko.stream.WatchedActorTerminatedException if the target actor is terminated.
The operator fails with an pekko.stream.WatchedActorTerminatedException if the target actor is terminated.
Emits when upstream emits
Backpressures when downstream backpressures
Completes when upstream completes
Fails when the watched actor terminates
Cancels when downstream cancels
- def watchTermination[M](matF: Function2[Mat, CompletionStage[Done], M]): Flow[In, Out, M]
Materializes to
CompletionStage<Done>
that completes on getting termination message.Materializes to
CompletionStage<Done>
that completes on getting termination message. The future completes with success when received complete message from upstream or cancel from downstream. It fails with the same error when received error message from downstream. - def wireTap(that: Graph[SinkShape[Out], _]): Flow[In, Out, Mat]
Attaches the given Sink to this Flow as a wire tap, meaning that elements that pass through will also be sent to the wire-tap Sink, without the latter affecting the mainline flow.
Attaches the given Sink to this Flow as a wire tap, meaning that elements that pass through will also be sent to the wire-tap Sink, without the latter affecting the mainline flow. If the wire-tap Sink backpressures, elements that would've been sent to it will be dropped instead.
It is similar to #alsoTo which does backpressure instead of dropping elements.
Emits when element is available and demand exists from the downstream; the element will also be sent to the wire-tap Sink if there is demand.
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def wireTap(f: Procedure[Out]): Flow[In, Out, Mat]
This is a simplified version of
wireTap(Sink)
that takes only a simple procedure.This is a simplified version of
wireTap(Sink)
that takes only a simple procedure. Elements will be passed into this "side channel" function, and any of its results will be ignored.If the wire-tap operation is slow (it backpressures), elements that would've been sent to it will be dropped instead. It is similar to #alsoTo but will not affect (i.e. backpressure) the flow tapped into.
This operation is useful for inspecting the passed through element, usually by means of side-effecting operations (such as
println
, or emitting metrics), for each element without having to modify it.For logging signals (elements, completion, error) consider using the log operator instead, along with appropriate
ActorAttributes.logLevels
.Emits when upstream emits an element; the same element will be passed to the attached function, as well as to the downstream operator
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def wireTapMat[M2, M3](that: Graph[SinkShape[Out], M2], matF: Function2[Mat, M2, M3]): Flow[In, Out, M3]
Attaches the given Sink to this Flow as a wire tap, meaning that elements that pass through will also be sent to the wire-tap Sink, without the latter affecting the mainline flow.
Attaches the given Sink to this Flow as a wire tap, meaning that elements that pass through will also be sent to the wire-tap Sink, without the latter affecting the mainline flow. If the wire-tap Sink backpressures, elements that would've been sent to it will be dropped instead.
It is similar to #alsoToMat which does backpressure instead of dropping elements.
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.- See also
- def withAttributes(attr: Attributes): Flow[In, Out, Mat]
Replace the attributes of this Flow with the given ones.
Replace the attributes of this Flow with the given ones. If this Flow is a composite of multiple graphs, new attributes on the composite will be less specific than attributes set directly on the individual graphs of the composite.
Note that this operation has no effect on an empty Flow (because the attributes apply only to the contained processing operators).
- def zip[T](source: Graph[SourceShape[T], _]): Flow[In, Pair[Out, T], Mat]
Combine the elements of current Flow and the given Source into a stream of tuples.
- def zipAll[U, A >: Out](that: Graph[SourceShape[U], _], thisElem: A, thatElem: U): Flow[In, Pair[A, U], Mat]
Combine the elements of current flow and the given Source into a stream of tuples.
Combine the elements of current flow and the given Source into a stream of tuples.
Emits when at first emits when both inputs emit, and then as long as any input emits (coupled to the default value of the completed input).
Backpressures when downstream backpressures
Completes when all upstream completes
Cancels when downstream cancels
- def zipAllMat[U, Mat2, Mat3, A >: Out](that: Graph[SourceShape[U], Mat2], thisElem: A, thatElem: U, matF: (Mat, Mat2) => Mat3): Flow[In, Pair[A, U], Mat3]
Combine the elements of current flow and the given Source into a stream of tuples.
Combine the elements of current flow and the given Source into a stream of tuples.
- See also
#zipAll Emits when at first emits when both inputs emit, and then as long as any input emits (coupled to the default value of the completed input). Backpressures when downstream backpressures Completes when all upstream completes Cancels when downstream cancels
- def zipLatest[T](source: Graph[SourceShape[T], _]): Flow[In, Pair[Out, T], Mat]
Combine the elements of 2 streams into a stream of tuples, picking always the latest element of each.
Combine the elements of 2 streams into a stream of tuples, picking always the latest element of each.
A
ZipLatest
has aleft
and aright
input port and oneout
port.No element is emitted until at least one element from each Source becomes available.
Emits when all of the inputs have at least an element available, and then each time an element becomes * available on either of the inputs
Backpressures when downstream backpressures
Completes when any upstream completes
Cancels when downstream cancels
- def zipLatestMat[T, M, M2](that: Graph[SourceShape[T], M], matF: Function2[Mat, M, M2]): Flow[In, Pair[Out, T], M2]
Combine the elements of current Flow and the given Source into a stream of tuples, picking always the latest element of each.
Combine the elements of current Flow and the given Source into a stream of tuples, picking always the latest element of each.
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.- See also
- def zipLatestWith[Out2, Out3](that: Graph[SourceShape[Out2], _], eagerComplete: Boolean, combine: Function2[Out, Out2, Out3]): Flow[In, Out3, Mat]
Combine the elements of multiple streams into a stream of combined elements using a combiner function, picking always the latest of the elements of each source.
Combine the elements of multiple streams into a stream of combined elements using a combiner function, picking always the latest of the elements of each source.
No element is emitted until at least one element from each Source becomes available. Whenever a new element appears, the zipping function is invoked with a tuple containing the new element and the other last seen elements.
Emits when all of the inputs have at least an element available, and then each time an element becomes available on either of the inputs
Backpressures when downstream backpressures
Completes when any upstream completes if
eagerComplete
is enabled or wait for all upstreams to completeCancels when downstream cancels
- def zipLatestWith[Out2, Out3](that: Graph[SourceShape[Out2], _], combine: Function2[Out, Out2, Out3]): Flow[In, Out3, Mat]
Combine the elements of multiple streams into a stream of combined elements using a combiner function, picking always the latest of the elements of each source.
Combine the elements of multiple streams into a stream of combined elements using a combiner function, picking always the latest of the elements of each source.
No element is emitted until at least one element from each Source becomes available. Whenever a new element appears, the zipping function is invoked with a tuple containing the new element and the other last seen elements.
Emits when all of the inputs have at least an element available, and then each time an element becomes available on either of the inputs
Backpressures when downstream backpressures
Completes when any of the upstreams completes
Cancels when downstream cancels
- def zipLatestWithMat[Out2, Out3, M, M2](that: Graph[SourceShape[Out2], M], combine: Function2[Out, Out2, Out3], matF: Function2[Mat, M, M2]): Flow[In, Out3, M2]
Put together the elements of current Flow and the given Source into a stream of combined elements using a combiner function, picking always the latest element of each.
Put together the elements of current Flow and the given Source into a stream of combined elements using a combiner function, picking always the latest element of each.
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.- See also
- def zipLatestWithMat[Out2, Out3, M, M2](that: Graph[SourceShape[Out2], M], eagerComplete: Boolean, combine: Function2[Out, Out2, Out3], matF: Function2[Mat, M, M2]): Flow[In, Out3, M2]
Put together the elements of current Flow and the given Source into a stream of combined elements using a combiner function, picking always the latest element of each.
Put together the elements of current Flow and the given Source into a stream of combined elements using a combiner function, picking always the latest element of each.
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.- See also
- def zipMat[T, M, M2](that: Graph[SourceShape[T], M], matF: Function2[Mat, M, M2]): Flow[In, Pair[Out, T], M2]
Combine the elements of current Flow and the given Source into a stream of tuples.
- def zipWith[Out2, Out3](that: Graph[SourceShape[Out2], _], combine: Function2[Out, Out2, Out3]): Flow[In, Out3, Mat]
Put together the elements of current Flow and the given Source into a stream of combined elements using a combiner function.
- def zipWithIndex: Flow[In, Pair[Out, Long], Mat]
Combine the elements of current flow into a stream of tuples consisting of all elements paired with their index.
Combine the elements of current flow into a stream of tuples consisting of all elements paired with their index. Indices start at 0.
Emits when upstream emits an element and is paired with their index
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- def zipWithMat[Out2, Out3, M, M2](that: Graph[SourceShape[Out2], M], combine: Function2[Out, Out2, Out3], matF: Function2[Mat, M, M2]): Flow[In, Out3, M2]
Put together the elements of current Flow and the given Source into a stream of combined elements using a combiner function.
Put together the elements of current Flow and the given Source into a stream of combined elements using a combiner function.
It is recommended to use the internally optimized
Keep.left
andKeep.right
combiners where appropriate instead of manually writing functions that pass through one of the values.- See also
Shadowed Implicit Value Members
- def mapMaterializedValue[M2](f: (Mat) => M2): Graph[FlowShape[In, Out], M2]
Transform the materialized value of this Graph, leaving all other properties as they were.
Transform the materialized value of this Graph, leaving all other properties as they were.
- f
function to map the graph's materialized value
- Implicit
- This member is added by an implicit conversion from Flow[In, Out, Mat] toGraphMapMatVal[FlowShape[In, Out], Mat] performed by method GraphMapMatVal in org.apache.pekko.stream.Graph.
- Shadowing
- This implicitly inherited member is shadowed by one or more members in this class.
To access this member you can use a type ascription:(flow: GraphMapMatVal[FlowShape[In, Out], Mat]).mapMaterializedValue(f)
- Definition Classes
- GraphMapMatVal
Deprecated Value Members
- def backpressureTimeout(timeout: FiniteDuration): Flow[In, Out, Mat]
If the time between the emission of an element and the following downstream demand exceeds the provided timeout, the stream is failed with a org.apache.pekko.stream.BackpressureTimeoutException.
If the time between the emission of an element and the following downstream demand exceeds the provided timeout, the stream is failed with a org.apache.pekko.stream.BackpressureTimeoutException. The timeout is checked periodically, so the resolution of the check is one period (equals to timeout value).
Emits when upstream emits an element
Backpressures when downstream backpressures
Completes when upstream completes or fails if timeout elapses between element emission and downstream demand.
Cancels when downstream cancels
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use the overloaded one which accepts java.time.Duration instead.
- def completionTimeout(timeout: FiniteDuration): Flow[In, Out, Mat]
If the completion of the stream does not happen until the provided timeout, the stream is failed with a org.apache.pekko.stream.CompletionTimeoutException.
If the completion of the stream does not happen until the provided timeout, the stream is failed with a org.apache.pekko.stream.CompletionTimeoutException.
Emits when upstream emits an element
Backpressures when downstream backpressures
Completes when upstream completes or fails if timeout elapses before upstream completes
Cancels when downstream cancels
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use the overloaded one which accepts java.time.Duration instead.
- def delay(of: FiniteDuration, strategy: DelayOverflowStrategy): Flow[In, Out, Mat]
Shifts elements emission in time by a specified amount.
Shifts elements emission in time by a specified amount. It allows to store elements in internal buffer while waiting for next element to be emitted. Depending on the defined pekko.stream.DelayOverflowStrategy it might drop elements or backpressure the upstream if there is no space available in the buffer.
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
- of
time to shift all messages
- strategy
Strategy that is used when incoming elements cannot fit inside the buffer
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use the overloaded one which accepts java.time.Duration instead.
- def dropWithin(duration: FiniteDuration): Flow[In, Out, Mat]
Discard the elements received within the given duration at beginning of the stream.
Discard the elements received within the given duration at beginning of the stream.
Emits when the specified time elapsed and a new upstream element arrives
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use the overloaded one which accepts java.time.Duration instead.
- def finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.Throwable]) @Deprecated
- Deprecated
(Since version 9)
- def formatted(fmtstr: String): String
- Implicit
- This member is added by an implicit conversion from Flow[In, Out, Mat] toStringFormat[Flow[In, Out, Mat]] performed by method StringFormat in scala.Predef.
- Definition Classes
- StringFormat
- Annotations
- @deprecated @inline()
- Deprecated
(Since version 2.12.16) Use
formatString.format(value)
instead ofvalue.formatted(formatString)
, or use thef""
string interpolator. In Java 15 and later,formatted
resolves to the new method in String which has reversed parameters.
- def groupedWeightedWithin(maxWeight: Long, costFn: Function[Out, Long], duration: FiniteDuration): Flow[In, List[Out], Mat]
Chunk up this stream into groups of elements received within a time window, or limited by the weight of the elements, whatever happens first.
Chunk up this stream into groups of elements received within a time window, or limited by the weight of the elements, whatever happens first. Empty groups will not be emitted if no elements are received from upstream. The last group before end-of-stream will contain the buffered elements since the previously emitted group.
Emits when the configured time elapses since the last group has been emitted or weight limit reached
Backpressures when downstream backpressures, and buffered group (+ pending element) weighs more than
maxWeight
Completes when upstream completes (emits last group)
Cancels when downstream completes
maxWeight
must be positive, andduration
must be greater than 0 seconds, otherwise IllegalArgumentException is thrown.- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use the overloaded one which accepts java.time.Duration instead.
- def groupedWithin(maxNumber: Int, duration: FiniteDuration): Flow[In, List[Out], Mat]
Chunk up this stream into groups of elements received within a time window, or limited by the given number of elements, whatever happens first.
Chunk up this stream into groups of elements received within a time window, or limited by the given number of elements, whatever happens first. Empty groups will not be emitted if no elements are received from upstream. The last group before end-of-stream will contain the buffered elements since the previously emitted group.
Emits when the configured time elapses since the last group has been emitted or
n
elements is bufferedBackpressures when downstream backpressures, and there are
n+1
buffered elementsCompletes when upstream completes (emits last group)
Cancels when downstream completes
maxNumber
must be positive, andduration
must be greater than 0 seconds, otherwise IllegalArgumentException is thrown.- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use the overloaded one which accepts java.time.Duration instead.
- def idleTimeout(timeout: FiniteDuration): Flow[In, Out, Mat]
If the time between two processed elements exceeds the provided timeout, the stream is failed with a org.apache.pekko.stream.StreamIdleTimeoutException.
If the time between two processed elements exceeds the provided timeout, the stream is failed with a org.apache.pekko.stream.StreamIdleTimeoutException. The timeout is checked periodically, so the resolution of the check is one period (equals to timeout value).
Emits when upstream emits an element
Backpressures when downstream backpressures
Completes when upstream completes or fails if timeout elapses between two emitted elements
Cancels when downstream cancels
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use the overloaded one which accepts java.time.Duration instead.
- def initialDelay(delay: FiniteDuration): Flow[In, Out, Mat]
Delays the initial element by the specified duration.
Delays the initial element by the specified duration.
Emits when upstream emits an element if the initial delay is already elapsed
Backpressures when downstream backpressures or initial delay is not yet elapsed
Completes when upstream completes
Cancels when downstream cancels
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use the overloaded one which accepts java.time.Duration instead.
- def initialTimeout(timeout: FiniteDuration): Flow[In, Out, Mat]
If the first element has not passed through this operator before the provided timeout, the stream is failed with a org.apache.pekko.stream.InitialTimeoutException.
If the first element has not passed through this operator before the provided timeout, the stream is failed with a org.apache.pekko.stream.InitialTimeoutException.
Emits when upstream emits an element
Backpressures when downstream backpressures
Completes when upstream completes or fails if timeout elapses before first element arrives
Cancels when downstream cancels
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use the overloaded one which accepts java.time.Duration instead.
- def keepAlive(maxIdle: FiniteDuration, injectedElem: Creator[Out]): Flow[In, Out, Mat]
Injects additional elements if upstream does not emit for a configured amount of time.
Injects additional elements if upstream does not emit for a configured amount of time. In other words, this operator attempts to maintains a base rate of emitted elements towards the downstream.
If the downstream backpressures then no element is injected until downstream demand arrives. Injected elements do not accumulate during this period.
Upstream elements are always preferred over injected elements.
Emits when upstream emits an element or if the upstream was idle for the configured period
Backpressures when downstream backpressures
Completes when upstream completes
Cancels when downstream cancels
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use the overloaded one which accepts java.time.Duration instead.
- def monitor[M](combine: Function2[Mat, FlowMonitor[Out], M]): Flow[In, Out, M]
Materializes to
FlowMonitor[Out]
that allows monitoring of the current flow.Materializes to
FlowMonitor[Out]
that allows monitoring of the current flow. All events are propagated by the monitor unchanged. Note that the monitor inserts a memory barrier every time it processes an event, and may therefor affect performance.The
combine
function is used to combine theFlowMonitor
with this flow's materialized value.- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.17) Use monitor() or monitorMat(combine) instead
- def recoverWith(clazz: Class[_ <: Throwable], supplier: Supplier[Graph[SourceShape[Out], NotUsed]]): Flow[In, Out, Mat]
RecoverWith allows to switch to alternative Source on flow failure.
RecoverWith allows to switch to alternative Source on flow failure. It will stay in effect after a failure has been recovered so that each time there is a failure it is fed into the
pf
and a new Source may be materialized.Since the underlying failure signal onError arrives out-of-band, it might jump over existing elements. This operator can recover the failure signal, but not the skipped elements, which will be dropped.
Throwing an exception inside
recoverWith
_will_ be logged on ERROR level automatically.Emits when element is available from the upstream or upstream is failed and element is available from alternative Source
Backpressures when downstream backpressures
Completes when upstream completes or upstream failed with exception pf can handle
Cancels when downstream cancels
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.6.6) Use recoverWithRetries instead.
- def splitAfter(substreamCancelStrategy: SubstreamCancelStrategy, p: Predicate[Out]): SubFlow[In, Out, Mat]
This operation applies the given predicate to all incoming elements and emits them to a stream of output streams.
This operation applies the given predicate to all incoming elements and emits them to a stream of output streams. It *ends* the current substream when the predicate is true.
- Annotations
- @deprecated
- Deprecated
(Since version 1.1.0) Use .withAttributes(ActorAttributes.supervisionStrategy(equivalentDecider)) rather than a SubstreamCancelStrategy
- See also
- def splitWhen(substreamCancelStrategy: SubstreamCancelStrategy, p: Predicate[Out]): SubFlow[In, Out, Mat]
This operation applies the given predicate to all incoming elements and emits them to a stream of output streams, always beginning a new one with the current element if the given predicate returns true for it.
This operation applies the given predicate to all incoming elements and emits them to a stream of output streams, always beginning a new one with the current element if the given predicate returns true for it.
- Annotations
- @deprecated
- Deprecated
(Since version 1.1.0) Use .withAttributes(ActorAttributes.supervisionStrategy(equivalentDecider)) rather than a SubstreamCancelStrategy
- See also
- def takeWithin(duration: FiniteDuration): Flow[In, Out, Mat]
Terminate processing (and cancel the upstream publisher) after the given duration.
Terminate processing (and cancel the upstream publisher) after the given duration. Due to input buffering some elements may have been requested from upstream publishers that will then not be processed downstream of this step.
Note that this can be combined with #take to limit the number of elements within the duration.
Emits when an upstream element arrives
Backpressures when downstream backpressures
Completes when upstream completes or timer fires
Cancels when downstream cancels or timer fires
See also Flow.limit, Flow.limitWeighted
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use the overloaded one which accepts java.time.Duration instead.
- def throttle(cost: Int, per: FiniteDuration, maximumBurst: Int, costCalculation: Function[Out, Integer], mode: ThrottleMode): Flow[In, Out, Mat]
Sends elements downstream with speed limited to
cost/per
.Sends elements downstream with speed limited to
cost/per
. Cost is calculating for each element individually by callingcalculateCost
function. This operator works for streams when elements have different cost(length). Streams ofByteString
for example.Throttle implements the token bucket model. There is a bucket with a given token capacity (burst size or maximumBurst). Tokens drops into the bucket at a given rate and can be
spared
for later use up to bucket capacity to allow some burstiness. Whenever stream wants to send an element, it takes as many tokens from the bucket as element costs. If there isn't any, throttle waits until the bucket accumulates enough tokens. Elements that costs more than the allowed burst will be delayed proportionally to their cost minus available tokens, meeting the target rate. Bucket is full when stream just materialized and started.Parameter
mode
manages behavior when upstream is faster than throttle rate:- pekko.stream.ThrottleMode.Shaping makes pauses before emitting messages to meet throttle rate
- pekko.stream.ThrottleMode.Enforcing fails with exception when upstream is faster than throttle rate. Enforcing cannot emit elements that cost more than the maximumBurst
It is recommended to use non-zero burst sizes as they improve both performance and throttling precision by allowing the implementation to avoid using the scheduler when input rates fall below the enforced limit and to reduce most of the inaccuracy caused by the scheduler resolution (which is in the range of milliseconds).
WARNING: Be aware that throttle is using scheduler to slow down the stream. This scheduler has minimal time of triggering next push. Consequently it will slow down the stream as it has minimal pause for emitting. This can happen in case burst is 0 and speed is higher than 30 events per second. You need to increase the
maximumBurst
if elements arrive with small interval (30 milliseconds or less). Use the overloadedthrottle
method withoutmaximumBurst
parameter to automatically calculate themaximumBurst
based on the given rate (cost/per
). In other words the throttler always enforces the rate limit whenmaximumBurst
parameter is given, but in certain cases (mostly due to limited scheduler resolution) it enforces a tighter bound than what was prescribed.Emits when upstream emits an element and configured time per each element elapsed
Backpressures when downstream backpressures or the incoming rate is higher than the speed limit
Completes when upstream completes
Cancels when downstream cancels
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use the overloaded one which accepts java.time.Duration instead.
- def throttle(elements: Int, per: FiniteDuration, maximumBurst: Int, mode: ThrottleMode): Flow[In, Out, Mat]
Sends elements downstream with speed limited to
elements/per
.Sends elements downstream with speed limited to
elements/per
. In other words, this operator set the maximum rate for emitting messages. This operator works for streams where all elements have the same cost or length.Throttle implements the token bucket model. There is a bucket with a given token capacity (burst size or maximumBurst). Tokens drops into the bucket at a given rate and can be
spared
for later use up to bucket capacity to allow some burstiness. Whenever stream wants to send an element, it takes as many tokens from the bucket as element costs. If there isn't any, throttle waits until the bucket accumulates enough tokens. Elements that costs more than the allowed burst will be delayed proportionally to their cost minus available tokens, meeting the target rate. Bucket is full when stream just materialized and started.Parameter
mode
manages behavior when upstream is faster than throttle rate:- pekko.stream.ThrottleMode.Shaping makes pauses before emitting messages to meet throttle rate
- pekko.stream.ThrottleMode.Enforcing fails with exception when upstream is faster than throttle rate
It is recommended to use non-zero burst sizes as they improve both performance and throttling precision by allowing the implementation to avoid using the scheduler when input rates fall below the enforced limit and to reduce most of the inaccuracy caused by the scheduler resolution (which is in the range of milliseconds).
WARNING: Be aware that throttle is using scheduler to slow down the stream. This scheduler has minimal time of triggering next push. Consequently it will slow down the stream as it has minimal pause for emitting. This can happen in case burst is 0 and speed is higher than 30 events per second. You need to increase the
maximumBurst
if elements arrive with small interval (30 milliseconds or less). Use the overloadedthrottle
method withoutmaximumBurst
parameter to automatically calculate themaximumBurst
based on the given rate (cost/per
). In other words the throttler always enforces the rate limit whenmaximumBurst
parameter is given, but in certain cases (mostly due to limited scheduler resolution) it enforces a tighter bound than what was prescribed.Emits when upstream emits an element and configured time per each element elapsed
Backpressures when downstream backpressures or the incoming rate is higher than the speed limit
Completes when upstream completes
Cancels when downstream cancels
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use the overloaded one which accepts java.time.Duration instead.
- def throttleEven(cost: Int, per: Duration, costCalculation: Function[Out, Integer], mode: ThrottleMode): Flow[In, Out, Mat]
This is a simplified version of throttle that spreads events evenly across the given time interval.
This is a simplified version of throttle that spreads events evenly across the given time interval.
Use this operator when you need just slow down a stream without worrying about exact amount of time between events.
If you want to be sure that no time interval has no more than specified number of events you need to use throttle with maximumBurst attribute.
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use throttle without
maximumBurst
parameter instead.- See also
- def throttleEven(cost: Int, per: FiniteDuration, costCalculation: Function[Out, Integer], mode: ThrottleMode): Flow[In, Out, Mat]
This is a simplified version of throttle that spreads events evenly across the given time interval.
This is a simplified version of throttle that spreads events evenly across the given time interval.
Use this operator when you need just slow down a stream without worrying about exact amount of time between events.
If you want to be sure that no time interval has no more than specified number of events you need to use throttle with maximumBurst attribute.
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use throttle without
maximumBurst
parameter instead.- See also
- def throttleEven(elements: Int, per: Duration, mode: ThrottleMode): Flow[In, Out, Mat]
This is a simplified version of throttle that spreads events evenly across the given time interval.
This is a simplified version of throttle that spreads events evenly across the given time interval.
Use this operator when you need just slow down a stream without worrying about exact amount of time between events.
If you want to be sure that no time interval has no more than specified number of events you need to use throttle with maximumBurst attribute.
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use throttle without
maximumBurst
parameter instead.- See also
- def throttleEven(elements: Int, per: FiniteDuration, mode: ThrottleMode): Flow[In, Out, Mat]
This is a simplified version of throttle that spreads events evenly across the given time interval.
This is a simplified version of throttle that spreads events evenly across the given time interval.
Use this operator when you need just slow down a stream without worrying about exact amount of time between events.
If you want to be sure that no time interval has no more than specified number of events you need to use throttle with maximumBurst attribute.
- Annotations
- @deprecated
- Deprecated
(Since version Akka 2.5.12) Use the overloaded one which accepts java.time.Duration instead.
- See also
- def →[B](y: B): (Flow[In, Out, Mat], B)
- Implicit
- This member is added by an implicit conversion from Flow[In, Out, Mat] toArrowAssoc[Flow[In, Out, Mat]] performed by method ArrowAssoc in scala.Predef.
- Definition Classes
- ArrowAssoc
- Annotations
- @deprecated
- Deprecated
(Since version 2.13.0) Use
->
instead. If you still wish to display it as one character, consider using a font with programming ligatures such as Fira Code.