如何从Akka中的EventStream创建服务器端事件?

时间:2017-11-29 13:50:23

标签: akka akka-stream akka-http

我试过了:EventStream - >来源 - > Akka HTTP(SSE)

正如我所看到的,这不起作用,因为来源将由Akka HTTP complete(Source, ...)实现。 并将消息从EventStream发送到物化源我需要ActorRef(有没有办法获得ActorRef?)

我在GitHub上找到了一个使用ActorPublisher的解决方案: https://github.com/calvinlfer/Akka-HTTP-Akka-Streams-Akka-Actors-Integration

但是由于ActorPublisher是一个内部API,我仍然希望有一个干净的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以使用Source.actorRef创建Source,将事件流元素转换为ServerSentEvent个实例,并BroadcastHub.sink,方式如下:

val (sseActor, sseSource) =
  Source.actorRef[EventStreamMessageOrWhatever](10, akka.stream.OverflowStrategy.dropTail)
    .map(s => /* convert event stream elements to ServerSideEvent */)
    .keepAlive(1.second, () => ServerSentEvent.heartbeat)
    .toMat(BroadcastHub.sink[ServerSentEvent])(Keep.both)
    .run()

如果存在下游需求,则向下游发送发送到具体化ActorRef的消息(即,事件流元素)。如果没有下游需求,则使用指定的溢出策略将消息缓冲到一定数量(在此示例中,缓冲区大小为10)。

然后,您可以将实体化演员订阅到EventStream

eventStream.subscribe(sseActor, ...)

物化Source可用于您的路径:

path("sse") {
  get {
    complete(sseSource)
  }
}

请注意,这种方法没有背压。