首页 > 解决方案 > 在 Play 中保持 SSE 连接的正确方法

问题描述

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

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

但是连接会被 Play/Akka 服务器自动关闭。这里最好的做法是什么:

标签: scalaplayframeworkakkaserver-sent-eventseventsource

解决方案


定期发送一个空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 对服务器发送事件的支持演示了相同的方法(Play 内部使用 Akka HTTP)。


推荐阅读