如何在akka-http中为一个websocket处理程序注入一个keep-alive?

时间:2017-08-14 16:46:47

标签: scala websocket akka-stream 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。我应该如何重组事物,以便注入一个保持活力?

1 个答案:

答案 0 :(得分:1)

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

您可以设置

idle-timeout = infinite

完全禁用超时。

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