5

Sto utilizzando PlayFramework 2.5.3 e vorrei creare un akka.stream.scaladsl.Source da un akka.event.EventStream (il flusso di eventi fa parte di un sistema di attori). Lo stream di eventi produrrebbe eventi di un certo tipo, quindi dovrei abbonarmi a quel determinato tipo di eventi e inviarli utilizzando play.api.mvc.Results.chunked. C'è un modo semplice per creare un tale Source usando Akka Streams 2.4.5?Creazione di un'origine da un EventStream

risposta

5

È possibile utilizzare Source.actorRef insieme all'abbonamento. Source.actorRef è una fonte che si materializza in un ActorRef, in modo da poter fare questo:

// 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 

noti che actorRef fonte è piuttosto limitata, per esempio, in modo naturale non supporta la strategia di overflow contropressione per il suo buffer interno. Puoi usare Source.actorPublisher con un attore che estende la caratteristica ActorPublisher[YourEventType], ti darà un po 'più di controllo. Tuttavia, dal momento che EventStream è una fonte basata su push pura, non sarà possibile fare molto di più con ActorPublisher rispetto a Source.actorRef, quindi si può anche usare l'approccio più semplice.

+0

Potrebbe spiegare perché si deve prima chiamare 'run()' (vale a dire materializzare il flusso) per ottenere un riferimento al riferimento dell'attore? – Mihai238

+1

@ Mihai238 perché il riferimento attore è il valore materializzato * di Source.actorRef' *. I valori materializzati, come suggerisce il loro nome, sono valori che vengono prodotti durante la materializzazione del flusso. Poiché 'Source.actorRef' è un progetto per il flusso che può essere materializzato più volte, deve fornire un' ActorRef' separato per ogni materializzazione. Dopotutto, non sarebbe molto utile se fornisse solo un "ActorRef" attraverso tutte le materializzazioni. –

Problemi correlati