5

私はPlayFramework 2.5.3を使用しており、akka.event.EventStreamからakka.stream.scaladsl.Sourceを作成したいと考えています(イベントストリームはアクターシステムの一部です)。イベントストリームは特定のタイプのイベントを生成するので、特定のタイプのイベントに登録してplay.api.mvc.Results.chunkedを使用してプッシュする必要があります。 Akka Streams 2.4.5を使ってそのようなSourceを作成する簡単な方法はありますか?EventStreamからソースを作成する

答えて

5

Source.actorRefをサブスクリプションとともに使用できます。 actorRefソースは、例えば、それが自然にその内部バッファのための背圧オーバーフロー戦略をサポートしていない、やや限られていることを

// choose the buffer size of the actor source and how the actor 
// will react to its overflow 
val eventListenerSource = Source.actorRef[YourEventType](32, OverflowStrategy.dropHead) 

// run the stream and obtain all materialized values 
val (eventListener, ...) = eventListenerSource 
    .viaMat(...)(Keep.left) 
    <...> 
    .run() 

// subscribe the source actor to the stream 
actorSystem.eventStream.subscribe(eventListener, classOf[YourEventType]) 

// now events emitted by the source will go to the actor 
// and through it to the stream 

注:この操作を行うことができますのでSource.actorRefは、ActorRefに具体化源です。 Source.actorPublisherActorPublisher[YourEventType]の特性を拡張する俳優と一緒に使用したい場合は、少しだけコントロールします。しかし、EventStreamは純粋なプッシュベースのソースなので、ではSource.actorRefよりもはるかに多くのことを行うことができないため、より簡単な方法を使用することもできます。

+0

アクターリファレンスへの参照を取得するために、なぜ最初に 'run()'をコールする必要があるのか​​(ストリームを具体化する)理由を説明してください。 – Mihai238

+1

@ Mihai238これは、アクター参照が 'Source.actorRef'の*マテリアライズされた値*であるためです。マテリアライズされた値は、その名前が示すとおり、ストリームのマテリアライゼーション時に生成される値です。 'Source.actorRef'は、複数回マテリアライズできるストリームの青写真なので、マテリアライゼーションごとに別々の' ActorRef'を提供する必要があります。結局のところ、すべてのマテリアライゼーションで「ActorRef」を1つだけ提供すれば、あまり役に立ちません。 –

関連する問題