我试过了: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,我仍然希望有一个干净的解决方案。
答案 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)
}
}
请注意,这种方法没有背压。