从EventStream创建源

时间:2016-05-19 14:33:37

标签: scala playframework server-sent-events akka-stream reactive-streams

我正在使用PlayFramework 2.5.3,并希望从akka.stream.scaladsl.Source创建akka.event.EventStream(事件流是演员系统的一部分)。事件流将产生来自特定类型的事件,因此我需要订阅该特定类型的事件并使用play.api.mvc.Results.chunked推送它们。有没有简单的方法可以使用Akka Streams 2.4.5创建这样的Source

1 个答案:

答案 0 :(得分:5)

您可以将Source.actorRef与订阅一起使用。 Source.actorRef是一个实现ActorRef的来源,因此您可以这样做:

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

请注意,actorRef源有些限制,例如,它自然不支持其内部缓冲区的背压溢出策略。您可能希望将Source.actorPublisher与扩展ActorPublisher[YourEventType]特征的actor一起使用,它会为您提供更多控制。但是,由于EventStream是一个纯粹的基于推送的源,因此您无法使用ActorPublisher而不是使用Source.actorRef执行更多操作,因此您也可以使用更简单的方法。