5

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

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.

+0

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

+1

@ 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. –