2017-01-09 4 views
2

私はAkka Streamが初めてで、ストリーム内の予期しない動作を処理するためのベストプラクティスを理解しようとしています。Akka Stream内で例外をスローするためのベストプラクティスは何ですか?Scala?

私はAccount Kit APIを使用して、短期間のコードを長いライブアクセストークンに交換するストリームを構築しています。ここで

は、ストリームを構築するための関連するコードです:

override def ExchangeCode: Flow[String, AccessTokenInfo, NotUsed] = 
Flow[String].mapAsync(1) { code => 
    ws.url(buildUrl("access_token")) 
    .withQueryString(
     "grant_type" -> "authorization_code", 
     "code" -> code, 
     "access_token" -> appToken 
    ) 
    .withRequestTimeout(timeout) 
    .get 
    .map { response => 
     if (response.status != 200) throw new RuntimeException("Unexpected response") 
     else response.json 
    } 
    .map { json => 
     AccessTokenInfo("123456", 123, "123456") 
    } 
} 

ステータスコードが200でない場合は例外をスローする場合、私は疑問に思う、それに対処するための正しい方法であるが、これは終了の唯一の方法です私はそれを知っているので、先にストリーム。 (現在の戻り値はダミーのものです)

答えて

1

ステータスが200でない場合、ストリームが終了することが厳密に必要ですか?通常、ダウンストリームでもエラーを送信したいので、Flowのユーザーは通知を受け、それに従って行動することができます。

このタイプの障害に対処する典型的な方法は、Tryです。取得したり、例外を取得し、故障のケースを処理できるようにすることが可能であった場合

//         Add Try Output 
//          | 
//          v 
override def ExchangeCode: Flow[String, Try[AccessTokenInfo], _] = 
    Flow[String] 
    ... 
    .map { response => response.status match { 
     case 200 => Try { response.json } 
     case _ => Try { throw new RuntimeException("Unexpected Response") } 
     } 
    } 
    .map(_ map (json => AccessTokenInfo("123456", 123, "123456"))) 

が今の流れのいずれかのユーザが有効なアクセストークンを取得することができます:わずかにあなたのフローを変更します。

のみ1エラーの種類 Tryも必要ではないようで、質問の特定の使用の場合は

あります

オプション。 1つの理由で生成できる例外は1つだけであるため、Optionはよりよく見えます。

override def ExchangeCode: Flow[String, Option[AccessTokenInfo], _] = 
    ... 
     case 200 => Some(response.json) 
     case _ => None 
    ... 
関連する問題