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