scala - 在 Play 中保持 SSE 连接的正确方法
问题描述
我想在我的 Play 2.7.x 应用程序的前端维护一个 SSE 管道,它将无限期地监听来自服务器的一些不规则间隔的事件(可能由其他用户触发)。我通过一个简单的 Akka 流发送事件,如下所示:
Ok.chunked(mySource via EventSource.flow).as(ContentTypes.EVENT_STREAM)
但是连接会被 Play/Akka 服务器自动关闭。这里最好的做法是什么:
- 将 play.server.http.idleTimeout 设置为无限(但文档 不推荐它;它也会影响其他非 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 对服务器发送事件的支持演示了相同的方法(Play 内部使用 Akka HTTP)。
推荐阅读
- firebase - Firebase 身份验证的持久性
- java - 使用 Spring oauth2 身份验证访问 Blizzard Dev Api
- spring - 来自 spring-cloud-gateway 过滤器的 RestTemplate 调用挂起
- swift - Xcode 11 beta 5:“'subscript(_:)' 已弃用:有关迁移路径,请参阅发行说明。”
- java - JCombobox 不能将多个选项重命名为相同的值
- php - PHP cookie 时间设置
- javascript - 如何在 ReactJS 中使用 Object.key.map()?
- python-3.x - 内部 lambda 函数 - 炽热文本算法调用端点不支持输入内容类型
- javascript - 如何打乱 HTMLCollection
- wordpress - woocommerce 更新后修复菜单