1
Akka HTTP客户端请求返回Future [HttpResponse] - 应该如何处理Future失败?只要记录一个错误或重新扔给主管?如何处理Akka HTTP客户端响应失败
是否存在客户端抛出的错误类型(因此会自动传播给主管)以及可能导致Furure失败的错误的文档。
Akka HTTP客户端请求返回Future [HttpResponse] - 应该如何处理Future失败?只要记录一个错误或重新扔给主管?如何处理Akka HTTP客户端响应失败
是否存在客户端抛出的错误类型(因此会自动传播给主管)以及可能导致Furure失败的错误的文档。
大部分是味道的问题。我通常转换Future[HttpResponse]
到Future[Try[HttpResponse]]
,然后如果你使用基于流的客户端处理它作为
response.flatMap { tryResp =>
tryResp match {
case Success(res) =>
res.status match {
case OK =>
// Unmarshal response here into Future[Something]
case Found =>
// Handle redirect by calling requestBlhBlah() again with anotehr URI
case _ =>
// I got status code I didn't expect so I wrap it along with body into Future failure
Unmarshal(res.entity).to[String].flatMap { body =>
Future.failed(new IOException(s"The response status is ${res.status} [${request.uri}] and response body is $body"))
}
}
case Failure(ex) =>
Future.failed(ex)
}
}
你也可以指定Decider
处理错误
val decider: Decider = {
case ex =>
ex.printStackTrace()
Supervision.Stop // Passes error down to subscriber
}
,然后在任何materializer
使用implicit val materializer = ActorMaterializer(ActorMaterializerSettings(system).withSupervisionStrategy(decider))(system)
或每个流的基础上经由.withAttributes(ActorAttributes.supervisionStrategy(decider))
根据Future
故障,由您决定如何处理。您可以使用recoverWith
将故障转换为别的东西,或将其记录在Future.onFailure
中。
Ahm ...我有点做同样的事情,但用Either而不是Try - 最终的结果是,如果一切正常,Future [Something]被返回,否则,失败的未来会返回原始响应(Future [HttpResponse])或我们为来自目标服务的已知错误响应定义的某些客户异常 – EugeneMi
但是(1)未来返回的异常永远不会传播给主管,因此永远不会处理,(2)We应该知道客户可以返回什么异常,并处理或记录他们 – EugeneMi
添加更多我的答案。 – expert