我想对Web应用程序执行一些服务器端事件(SSE)。我想我已经把所有的SSE管道化了。我现在需要在房子的Akka HTTP端创建一个Source。
我发现你可以这样做:
val source = Source.actorRef(5, akka.stream.OverflowStrategy.dropTail)
我想要做的是以某种方式“发布”到这个来源,大概是通过向演员发送消息。我从文档中看到此调用会创建Source<T,ActorRef>
。
如何获取此ActorRef实例以便向其发送消息?
答案 0 :(得分:2)
要从ActorRef
获取具体化的Source.actorRef
,必须运行该流。例如,假设您要将SSE有效负载数据(以String
的形式)发送给此actor,该actor将该数据转换为ServerSentEvent
个对象以发送给客户端。你可以这样做:
val (actor, sseSource) =
Source.actorRef[String](5, akka.stream.OverflowStrategy.dropTail)
.map(s => /* convert String to ServerSideEvent */)
.keepAlive(1.second, () => ServerSentEvent.heartbeat)
.toMat(BroadcastHub.sink[ServerSentEvent])(Keep.both)
.run()
// (ActorRef, Source[ServerSentEvent, NotUsed])
现在您可以向物化参与者发送消息:
actor ! "quesadilla"
在您的路线中使用sseSource
:
path("events") {
get {
complete(sseSource)
}
}
请注意,此方法没有背压(即,向演员发送的消息被解雇并被遗忘)。