web-dev-qa-db-ja.com

OkHttpClientには最大再試行回数がありますか

OkHttpClientの接続失敗時の再試行オプションを設定しています。

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

何回挑戦し続けるのか知りたいです。 ソースコード を見ると、上限はありませんでした。数回の試行後にクライアントが試行を停止するように構成するにはどうすればよいですか?

13
RajV

ここにもっとドキュメントがあります https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.Builder.html#retryOnConnectionFailure-boolean-

接続の問題が発生したときに再試行するかどうかをこのクライアントを構成します。デフォルトでは、このクライアントは次の問題からサイレントに回復します。

  • 到達できないIPアドレス。URLのホストに複数のIPアドレスがある場合、個々のIPアドレスに到達できなくても、リクエスト全体は失敗しません。これにより、マルチホームサービスの可用性が向上します。
  • プールされた接続が古くなっています。ConnectionPoolはソケットを再利用してリクエストの待ち時間を減らしますが、これらの接続は時々タイムアウトになります。

  • 到達できないプロキシサーバー。ProxySelectorを使用して、複数のプロキシサーバーを順番に試行し、最終的に直接接続にフォールバックできます。

これをfalseに設定すると、破壊的である場合にリクエストの再試行を回避できます。この場合、呼び出し側のアプリケーションは、接続障害の回復を独自に行う必要があります。

しかし、一般的には、既存の古い接続、または再試行可能な代替パスがある場合に再試行することを目的としています。まったく同じことを無期限に再試行しないこと。

ConnectionSpecSelector.connectionFailedも参照してください

8
Yuri Schimke

以下の回避策を作成しました:

@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;
}
4
Liangliang Sha

最大制限を設定するための組み込みメソッドはありませんが、以下のようにインターセプターを追加できます。

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;
    }
});

インターセプトの詳細については、 ここ を参照してください。

3
Prerak Sola

RetryAndFollowUpInterceptorのソースコードによると20

  /**
   * How many redirects and auth challenges should we attempt? Chrome follows 21 redirects; Firefox,
   * curl, and wget follow 20; Safari follows 16; and HTTP/1.0 recommends 5.
   */
  private static final int MAX_FOLLOW_UPS = 20;
1
android_dev

OkHttp は、低速または信頼性の低い接続で、成功するまでリクエストを「積極的に」繰り返す可能性があります。これは、GET、POSTまたはその他のタイプのリクエストに対して行われます。

0
Rajesh Nasit