在 Play 中维护 SSE 连接的正确方法

Proper way to maintain an SSE connection in Play

我想在我的 Play 2.7.x 应用程序的前端维护一个 SSE 管道,它将无限期地侦听来自服务器的一些不规则间隔的事件(可能由其他用户触发)。我通过简单的 Akka 流程发送事件,如下所示:

Ok.chunked(mySource via EventSource.flow).as(ContentTypes.EVENT_STREAM)

但是 Play/Akka 服务器会自动关闭连接。这里的最佳行动方案是什么:

定期发送一个空的 Event 以保持连接:

import scala.concurrent.duration._

val heartbeat = Event("", None, None)

val sseSource =
  mySource
    .via(EventSource.flow)
    .keepAlive(1.second, () => heartbeat)

Ok.chunked(sseSource).as(ContentTypes.EVENT_STREAM)

Akka HTTP's support for server-sent events 演示了相同的方法(Play 内部使用 Akka HTTP)。