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