Scala Akka http检测客户端连接关闭
我有个问题 我有Akka HTTP服务器,并使用Akka HTTP客户端。客户端基本上使用Http.singleRequest()进行大量外部调用。这需要很多时间,有时用户会关闭与我的服务器的连接 所以问题是-我怎样才能检测到用户已经关闭了连接 server.scala:Scala Akka http检测客户端连接关闭,scala,akka,akka-stream,akka-http,Scala,Akka,Akka Stream,Akka Http,我有个问题 我有Akka HTTP服务器,并使用Akka HTTP客户端。客户端基本上使用Http.singleRequest()进行大量外部调用。这需要很多时间,有时用户会关闭与我的服务器的连接 所以问题是-我怎样才能检测到用户已经关闭了连接 server.scala: val requestHandler: HttpRequest => HttpResponse = { case HttpRequest(HttpMethods.GET, Uri.Path("/"), _,
val requestHandler: HttpRequest => HttpResponse = {
case HttpRequest(HttpMethods.GET, Uri.Path("/"), _, _, _) =>
Thread.sleep(5000)
println("reply")
HttpResponse(entity = HttpEntity(
ContentTypes.`text/html(UTF-8)`,
"Ok"))
}
val serverBinding: Future[Http.ServerBinding] = Http().bind(host, port)
.via(reactToTopLevelFailures)
.to(Sink.foreach { connection: IncomingConnection =>
println("Accepted new connection from " + connection.remoteAddress)
connection.handleWith(Flow[HttpRequest] map requestHandler)
})
.run()
您只需通过cURL执行请求并立即取消它,您仍将在控制台中看到“reply”
感谢TCP连接和HTTP请求提供了不同抽象级别的关注点。通常http处理程序不应该关心连接的状态。如果是这样的话,可能应该重新考虑设计。你在解决什么问题?@simpadjo实际上在用户断开连接(重新加载/刷新页面等)时停止使用killswitch处理源代码。我正在使用Akka流进行大量计算,当我不再需要结果时,我想停止这样做。Websockets可能是一个解决方案。这是真的,但我不能使用Websockets(我正在考虑创建distributed actor系统(因为我有3个工作人员在运行相同的代码),并检测是否收到相同的请求。在这种情况下,可以终止正在运行的流。