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.
Problemi correlati
- 1. Creazione di un processo da un driver
- 2. Creazione di CSS da un file HTML
- 3. Creazione di un'immagine da un DIV
- 4. Creazione di un UIView da NIB
- 5. Creazione di un oggetto da collezione
- 6. Creazione di un dataframe Spark da un RDD di liste
- 7. Creazione di un lettore di scala da un file
- 8. Creazione di NSImage da NSColor
- 9. Creazione di notifiche da InstrumentationTestCase
- 10. Spark: creazione di un RDD da un servizio REST
- 11. Creazione di un PDF da un report RDLC in background
- 12. Creazione di un IMP da un blocco Objective-C
- 13. Creazione di un IPEndPoint da un nome host
- 14. Creazione di un file jar eseguibile da un progetto clojure?
- 15. Creazione di un popover da un UIButton in Swift
- 16. Creazione di un CocoaPod da un progetto Xcode esistente
- 17. Creazione di un menu a discesa da un file .json
- 18. Creazione di un NSMutableArray da un NSArray Objective-C
- 19. Creazione di un InputStream Java da un enumeratore [Array [Byte]]
- 20. Creazione di UIImage da CIImage
- 21. Creazione oggetto fstream da un puntatore FILE *
- 22. Creazione di un vettore da elementi di elenco in R
- 23. Creazione di una tabella di pivot da un DataTable
- 24. Creazione di un sistema di elaborazione ordini da Magento?
- 25. Creazione di file zip da un flusso di memoria C#
- 26. Creazione di una stringa lunga da un set di risultati
- 27. Creazione matrice da Window.location.hash
- 28. C# - Creazione di un Int64 da due Int32
- 29. Creazione di un programma che deve essere trasmesso da avahi
- 30. Creazione di un singolo modulo CommonJS da diverse classi TypeScript
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. –