2016-06-17 34 views
7

OkHttpClientの接続失敗時の再試行オプションを設定しています。OkHttpClientに最大再試行回数があります

client = new OkHttpClient(); 
client.setRetryOnConnectionFailure(true); 

私は何度も試してみたいと思います。 source codeを見ると、私には最大限の制限はありませんでした。数回試行した後でクライアントの試行を停止するようにクライアントを設定するにはどうすればよいですか?

答えて

5

より多くのドキュメントは、接続の問題が発生した ときに再試行するか、しないように、このクライアントを構成し、ここでhttps://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.Builder.html#retryOnConnectionFailure-boolean-

があります。

  • 到達不能IPアドレス:デフォルトでは、このクライアントは黙っ 次のような問題から回復します。 URLのホストに複数のIPアドレスがある場合、個々のIPアドレスに到達できない場合でも、全体の要求は失敗しません。これにより、マルチホームサービスの可用性が向上します。
  • 古くプールされた接続。 ConnectionPoolはソケットを再利用して要求の待ち時間を減らしますが、これらの接続は時折タイムアウトします。

  • 到達不能なプロキシサーバー。 ProxySelectorを使用すると、複数のプロキシサーバーを順番に試行することができ、最終的に直接接続に戻ることができます。

この要求をfalseに設定すると、要求を再試行すると破壊的な状態になるのを防ぐことができます。この場合、呼び出し元のアプリケーションは接続障害の回復を自身で行う必要があります。

しかし、一般的には、古い接続が存在する場合や再試行可能な代替パスがある場合は、再試行することを意図しています。同じことを無限に再試行しないでください。

またConnectionSpecSelector.connectionFailed

+0

これも私の理解です。また、失敗したSSLハンドシェイクも再試行します。しかし、それは完全にTCP接続の失敗を再試行するようではありません。 – RajV

1

最大限を設定する方法はありませんが、以下のようなインターセプタを追加できます。

client.interceptors().add(new Interceptor() { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 

     // try the request 
     Response response = chain.proceed(request); 

     int tryCount = 0; 
     int maxLimit = 3; //Set your max limit here 

     while (!response.isSuccessful() && tryCount < maxLimit) { 

      Log.d("intercept", "Request failed - " + tryCount); 

      tryCount++; 

      // retry the request 
      response = chain.proceed(request); 
     } 

     // otherwise just pass the original response on 
     return response; 
    } 
}); 

インターセプトの詳細はhereです。

+0

response.isSuccessful()チェックを。それは接続障害のために働くでしょうか? – RajV

+0

はい。応答コードが2xxまたは3xxの場合、 'isSuccessful()'は 'true'を返します。休息のため、 'false'を返します。接続の失敗は主に4xxなので、うまくいくはずです。 –

+0

TCP接続に失敗した場合、HTTP要求を送信できなかったか、または応答が得られませんでした。ステータスコードがどのように4xxになるかわかりません。 – RajV

2

参照Iを以下の回避策を行った:HTTPステータスコードの

@Override 
public Response intercept(Chain chain) throws IOException { 
    Request request = chain.request(); 
    // try the request 
    Response response = doRequest(chain,request); 
    int tryCount = 0; 
    while (response == null && tryCount <= RetryCount) { 
    String url = request.url().toString(); 
    url = switchServer(url); 
    Request newRequest = request.newBuilder().url(url).build(); 
    tryCount++; 
    // retry the request 
    response = doRequest(chain,newRequest); 
    } 
    if(response == null){//important ,should throw an exception here 
     throw new IOException(); 
    } 
    return response; 
} 

private Response doRequest(Chain chain,Request request){ 
    Response response = null; 
    try{ 
     response = chain.proceed(request); 
    }catch (Exception e){ 
    } 
    return response; 
} 
+0

これは完全に私のために働いています。どうもありがとう。 – yoavgray

関連する問題