!str #16520 Add ActorRefSource
* and rename the factory for ActorPublisherSource, from Source.apply to Source.actorPublisher * including internal buffer, with OverflowStrategy * support to complete/fail stream
This commit is contained in:
parent
946faedd95
commit
f4ed62b84c
13 changed files with 318 additions and 33 deletions
|
|
@ -23,6 +23,7 @@ import akka.actor.ActorRef
|
|||
import scala.concurrent.Promise
|
||||
import org.reactivestreams.Subscriber
|
||||
import akka.stream.stage.SyncDirective
|
||||
import akka.stream.OverflowStrategy
|
||||
|
||||
/**
|
||||
* A `Source` is a set of stream processing steps that has one open output. It can comprise
|
||||
|
|
@ -262,14 +263,6 @@ object Source extends SourceApply {
|
|||
def apply[T](initialDelay: FiniteDuration, interval: FiniteDuration, tick: T): Source[T, Cancellable] =
|
||||
new Source(new TickSource(initialDelay, interval, tick, none, shape("TickSource")))
|
||||
|
||||
/**
|
||||
* Creates a `Source` that is materialized to an [[akka.actor.ActorRef]] which points to an Actor
|
||||
* created according to the passed in [[akka.actor.Props]]. Actor created by the `props` should
|
||||
* be [[akka.stream.actor.ActorPublisher]].
|
||||
*/
|
||||
def apply[T](props: Props): Source[T, ActorRef] =
|
||||
new Source(new PropsSource(props, none, shape("PropsSource")))
|
||||
|
||||
/**
|
||||
* Create a `Source` with one element.
|
||||
* Every connected `Sink` of this stream will see an individual stream consisting of one element.
|
||||
|
|
@ -327,4 +320,42 @@ object Source extends SourceApply {
|
|||
def subscriber[T]: Source[T, Subscriber[T]] =
|
||||
new Source(new SubscriberSource[T](none, shape("SubscriberSource")))
|
||||
|
||||
/**
|
||||
* Creates a `Source` that is materialized to an [[akka.actor.ActorRef]] which points to an Actor
|
||||
* created according to the passed in [[akka.actor.Props]]. Actor created by the `props` should
|
||||
* be [[akka.stream.actor.ActorPublisher]].
|
||||
*/
|
||||
def actorPublisher[T](props: Props): Source[T, ActorRef] =
|
||||
new Source(new ActorPublisherSource(props, none, shape("ActorPublisherSource")))
|
||||
|
||||
/**
|
||||
* Creates a `Source` that is materialized as an [[akka.actor.ActorRef]].
|
||||
* Messages sent to this actor will be emitted to the stream if there is demand from downstream,
|
||||
* otherwise they will be buffered until request for demand is received.
|
||||
*
|
||||
* Depending on the defined [[akka.stream.OverflowStrategy]] it might drop elements if
|
||||
* there is no space available in the buffer.
|
||||
*
|
||||
* The buffer can be disabled by using `bufferSize` of 0 and then received messages are dropped
|
||||
* if there is no demand from downstream. When `bufferSize` is 0 the `overflowStrategy` does
|
||||
* not matter.
|
||||
*
|
||||
* The stream can be completed successfully by sending [[akka.actor.PoisonPill]] or
|
||||
* [[akka.actor.Status.Success]] to the actor reference.
|
||||
*
|
||||
* The stream can be completed with failure by sending [[akka.actor.Status.Failure]] to the
|
||||
* actor reference.
|
||||
*
|
||||
* The actor will be stopped when the stream is completed, failed or cancelled from downstream,
|
||||
* i.e. you can watch it to get notified when that happens.
|
||||
*
|
||||
* @param bufferSize The size of the buffer in element count
|
||||
* @param overflowStrategy Strategy that is used when incoming elements cannot fit inside the buffer
|
||||
*/
|
||||
def actorRef[T](bufferSize: Int, overflowStrategy: OverflowStrategy): Source[T, ActorRef] = {
|
||||
require(bufferSize >= 0, "bufferSize must be greater than or equal to 0")
|
||||
require(overflowStrategy != OverflowStrategy.Backpressure, "Backpressure overflowStrategy not supported")
|
||||
new Source(new ActorRefSource(bufferSize, overflowStrategy, none, shape("ActorRefSource")))
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue