Подтвердить что ты не робот

У OkHttpClient максимальное количество попыток

Я устанавливаю параметр повтора при отключении соединения для OkHttpClient.

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

Мне хотелось бы знать, сколько раз он будет продолжать пытаться. Глядя на исходный код я не видел никакого максимального предела. Как настроить клиент для остановки попытки после нескольких попыток?

4b9b3361

Ответ 1

Здесь больше документов https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.Builder.html#retryOnConnectionFailure-boolean-

Настройте этого клиента на повторную попытку или нет, когда проблема подключения встречается. По умолчанию этот клиент тихо восстанавливается с следующие проблемы:

  • Недоступные IP-адреса. Если хост URL-адреса имеет несколько IP-адресов, неспособность достичь какого-либо отдельного IP-адреса не приведет к общему запросу. Это может увеличить доступность услуг с несколькими родителями.
  • Связи с пустым соединением.. ConnectionPool повторно использует сокеты для уменьшения задержки запросов, но эти подключения будут время от времени.

  • Недоступные прокси-серверы.. ProxySelector можно использовать для последовательного последовательного подключения нескольких прокси-серверов, в конечном итоге отступая к прямому подключению.

Установите для этого параметра значение false, чтобы избежать повторных запросов, когда это происходит, является разрушительным. В этом случае вызывающее приложение должно выполнить собственное восстановление сбоев подключения.

Но, как правило, я считаю, что он пытается повторить попытку, когда существует существующее устаревшее соединение или альтернативные пути, которые можно повторить. Не повторять точно то же самое бесконечно.

Также см. ConnectionSpecSelector.connectionFailed

Ответ 2

Я сделал обходной путь ниже:

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

Ответ 3

Нет встроенного метода для установки максимального предела, но вы можете добавить перехватчик, как показано ниже.

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

Более подробную информацию о перехватах можно найти здесь.

Ответ 4

OkHttp потенциально будет повторять ваши запросы на медленном/ненадежном соединении "агрессивно", пока оно не будет успешным. Это делается для GET, POST или любого другого типа запросов

Ответ 5

Согласно исходному коду 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;