在 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 服务器会自动关闭连接。这里的最佳行动方案是什么:
- 将 play.server.http.idleTimeout 设置为无限(但 documentation
不推荐它;它还会影响其他非 SSE 端点)?
- 依靠浏览器自动重新建立连接(但据我所知并非所有浏览器都这样做)?
- 在客户端 Javascript 中显式实现一些重新连接逻辑?
- 也许可以针对特定操作在本地覆盖 idleTimeout(不过我还没有找到方法)?
定期发送一个空的 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)。
我想在我的 Play 2.7.x 应用程序的前端维护一个 SSE 管道,它将无限期地侦听来自服务器的一些不规则间隔的事件(可能由其他用户触发)。我通过简单的 Akka 流程发送事件,如下所示:
Ok.chunked(mySource via EventSource.flow).as(ContentTypes.EVENT_STREAM)
但是 Play/Akka 服务器会自动关闭连接。这里的最佳行动方案是什么:
- 将 play.server.http.idleTimeout 设置为无限(但 documentation 不推荐它;它还会影响其他非 SSE 端点)?
- 依靠浏览器自动重新建立连接(但据我所知并非所有浏览器都这样做)?
- 在客户端 Javascript 中显式实现一些重新连接逻辑?
- 也许可以针对特定操作在本地覆盖 idleTimeout(不过我还没有找到方法)?
定期发送一个空的 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)。