如何将 keep-alive 注入 akka-http 中的 websocket 处理程序?

how can I inject a keep-alive into a websocket handler in akka-http?

我已经编写了一些代码来使用 akka-http 10.0.9 通过 websockets 与浏览器进行通信。它工作得很好,除了连接超时。尽管我们向客户端发送恒定的数据流,但客户端很长一段时间都没有请求任何东西。

我知道解决方案是将 keep-alive 消息注入传入的 websocket 源,如下所示:

val s = Source(List(data....)).keepAlive(15.seconds, () => Strict.TextMessage("heart beat"))

但是,akka-http api 调用流程来处理连接:

path("query") {
        parameter('session, 'package) {
          (session,packageId) =>
            val sg = getGraphManager(session)
            sg match {
              case Left(error) => complete(StatusCodes.BadRequest -> TSError(msg=error))
              case Right(gm) =>
                val tsFlow = new TSFlow(ksource, session)
                handleWebSocketMessages(Flow.fromGraph(tsFlow.flowGraph))

            }
         }
 }

因此,我从来没有看到传入的源,所以没有机会注入 keep-alive。我应该如何重组才能注入 keep-alive?

控制服务器端连接断开方式的唯一方法是更改​​ idle-timeout(请参阅文档 here and here)。

可以设置

idle-timeout = infinite

完全禁用超时。

如果要使用保活消息,需要从客户端发送。如果您的客户端基于 Akka Streams,.keepAlive 组合器是获取它们的最简单方法。