客户端关闭连接后如何进行清理

时间:2019-07-22 15:04:19

标签: scala akka

我正在使用akka创建代理API,在将请求转发到实际API之前会做一些准备。对于其中一个端点,响应是流json数据,并且客户端可以随时关闭连接。 Akka似乎可以自动处理此问题,但是问题是客户端关闭连接后我需要进行一些清理。

path("query") {
  post {

    decodeRequest {
      entity(as[Query]) { query =>
        // proxy does some preparations
        val json: String = query.prepared.toJson.toString()

        // proxy sends request to actual server
        val request = HttpRequest(
          method = HttpMethods.POST,
          uri = serverUrl + "/query",
          entity = HttpEntity(ContentTypes.`application/json`, json)
        )
        val responseFuture = Http().singleRequest(request)
        val response: HttpResponse = Await.result(responseFuture, PROXY_TIMEOUT)

        // proxy forwards server's response to user
        complete(response)
      }
    }
  }
}

我尝试做类似的事情

responseFuture.onComplete(_ => doCleanup())

但这不起作用,因为即使服务器继续发送数据直到客户端关闭连接,responseFuture也会立即完成。 complete(response)也立即返回。

所以我想知道只有在客户端关闭连接后,才可以调用doCleanup()。

编辑:我需要做的清理工作是因为代理创建了一些数据流,这些数据流是临时的,并且只保留到服务器发送最后一条消息为止。一旦发生这种情况,这些流需要删除。

1 个答案:

答案 0 :(得分:0)

您可以对代码进行最小的更改,例如:

val responseFuture = Http().singleRequest(request)
val response: HttpResponse = try {
                               Await.result(responseFuture, PROXY_TIMEOUT)
                             } finally {
                                 doCleanup()
                             }

complete(response)

或者您可以不加阻止地做到这一点:

val responseFuture = Http().singleRequest(request)
val cleaned = responseFuture.andThen{case _  => doCleanUp()}
complete(cleaned) //it's possible to complete response with Future
相关问题