Ich benutze PlayFramework 2.5.3 und möchte eine akka.stream.scaladsl.Source
von einem akka.event.EventStream
erstellen (der Eventstream ist Teil eines Actor-Systems). Der Ereignis-Stream würde Ereignisse von einem bestimmten Typ erzeugen. Daher müsste ich diesen bestimmten Ereignistyp abonnieren und unter Verwendung von play.api.mvc.Results.chunked
pushen. Gibt es eine einfache Möglichkeit, eine solche Source
mit Akka Streams 2.4.5 zu erstellen?Erstellen einer Quelle aus einem EventStream
5
A
Antwort
5
Sie können Source.actorRef
zusammen mit dem Abonnement verwenden. Source.actorRef
ist eine Quelle, die in eine ActorRef
materialisiert, so können Sie dies tun:
// 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
Beachten Sie, dass actorRef
Quelle etwas eingeschränkt ist, zum Beispiel, ist es natürlich nicht Rückstauüberlauf-Strategie für seine internen Puffer unterstützt. Sie können Source.actorPublisher
mit einem Akteur verwenden, der ActorPublisher[YourEventType]
Merkmal erweitert, es gibt Ihnen ein bisschen mehr Kontrolle. Da EventStream
jedoch eine reine Push-basierte Quelle ist, werden Sie mit ActorPublisher
nicht viel mehr können als mit Source.actorRef
, so dass Sie genauso gut den einfacheren Ansatz verwenden können.
Könnten Sie bitte erklären, warum zuerst 'run()' aufgerufen werden muss (d. H. Um den Stream zu materialisieren), um eine Referenz auf die Aktorreferenz zu erhalten? – Mihai238
@ Mihai238 Das liegt daran, dass die Aktor-Referenz der materialisierte Wert von 'Source.actorRef' * ist. Materialisierte Werte sind, wie ihr Name andeutet, Werte, die bei der Materialisierung des Stromes entstehen. Da 'Source.actorRef' ein Blueprint für den Stream ist, der mehrmals materialisiert werden kann, muss er für jede Materialisierung ein separates' ActorRef' bereitstellen. Schließlich wäre es nicht sehr nützlich, wenn es nur einen "ActorRef" über alle Materialisierungen hinweg geben würde. –