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
5
A
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.
Potrebbe spiegare perché si deve prima chiamare 'run()' (vale a dire materializzare il flusso) per ottenere un riferimento al riferimento dell'attore? – Mihai238
@ 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. –