5

J'utilise PlayFramework 2.5.3 et je voudrais créer un akka.stream.scaladsl.Source à partir d'un akka.event.EventStream (le flux d'événements fait partie d'un système d'acteur). Le flux d'événements produirait des événements à partir d'un certain type, donc je devrais souscrire à ce type d'événements et les pousser en utilisant play.api.mvc.Results.chunked. Y at-il un moyen facile de créer un tel Source en utilisant Akka Streams 2.4.5?Création d'une source à partir d'un EventStream

Répondre

5

Vous pouvez utiliser Source.actorRef avec l'abonnement. Source.actorRef est une source qui se matérialise dans un ActorRef, de sorte que vous pouvez faire ceci:

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

Notez que actorRef source est quelque peu limitée, par exemple, il ne supporte pas naturellement la stratégie de débordement pour son contre-pression tampon interne. Vous pouvez utiliser Source.actorPublisher avec un acteur qui s'étend ActorPublisher[YourEventType] trait, il vous donnera un peu plus de contrôle. Cependant, puisque EventStream est une pure source basée sur le push, vous ne pourrez pas faire beaucoup plus avec ActorPublisher qu'avec Source.actorRef, donc vous pouvez tout aussi bien utiliser l'approche la plus simple.

+0

Pourriez-vous expliquer pourquoi on doit d'abord appeler 'run()' (c'est-à-dire matérialiser le flux) afin d'obtenir une référence à la référence de l'acteur? – Mihai238

+1

@ Mihai238 c'est parce que la référence d'acteur est la valeur matérialisée * de Source.actorRef. Les valeurs matérialisées, comme leur nom l'indique, sont des valeurs qui sont produites lors de la matérialisation du cours d'eau. Parce que 'Source.actorRef' est un plan pour le flux qui peut être matérialisé plusieurs fois, il doit fournir un' ActorRef' distinct pour chaque matérialisation. Après tout, ce ne serait pas très utile si cela ne fournissait qu'un seul 'ActorRef' sur toutes les matérialisations. –