2016-11-06 7 views
1

Akka HTTPクライアント要求はFuture [HttpResponse]を返す - 未来を処理するにはどうすればよいですか?エラーを記録するか、スーパーバイザに再度投げてください。Akka HTTPクライアントの応答エラーを処理する方法

Furureが失敗する可能性があるエラーと同様に、クライアントからスローされて返される可能性のあるエラーのタイプのドキュメント(したがって自動的にスーパバイザに伝播される)のドキュメントがありますか。

答えて

2

ほとんど味の問題です。私はあなたが、フローベースのクライアントを使用している場合にも、エラー

val decider: Decider = { 
    case ex => 
    ex.printStackTrace() 
    Supervision.Stop // Passes error down to subscriber 
} 

を処理するためにDeciderを指定してmaterializer

のいずれかでそれを使用することができ、通常 Future[Try[HttpResponse]]Future[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) 
    } 
} 

としてそれを扱います.withAttributes(ActorAttributes.supervisionStrategy(decider))

介し
implicit val materializer = ActorMaterializer(ActorMaterializerSettings(system).withSupervisionStrategy(decider))(system) 

またはフロー単位で

Futureによると、それはどのように処理するかはあなた次第です。 recoverWithを使用して障害を何かに変換したり、Future.onFailureにログインしたりできます。

+0

Ahm ...同じことをやっていますが、Tryの代わりにどちらかを使用します。最終結果は、すべてが正常であればFuture [Something]が返されます。そうでなければ失敗した未来が返されます。元の応答(Future [HttpResponse])、または対象サービスからの既知のエラー応答のために定義した何らかの顧客例外 – EugeneMi

+0

しかし、(1)将来返される例外はスーパーバイザに伝達されることはないため、クライアントが返すことができる例外を知っていて、それを処理したりログしたりする必要があります – EugeneMi

+0

私の答えにさらに追加しました。 – expert

関連する問題