我正在使用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()。
编辑:我需要做的清理工作是因为代理创建了一些数据流,这些数据流是临时的,并且只保留到服务器发送最后一条消息为止。一旦发生这种情况,这些流需要删除。
答案 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