web-dev-qa-db-fra.com

OkHttpClient a-t-il un nombre maximal de tentatives

Je suis en train de définir l'option de nouvelle tentative sur un échec de connexion pour OkHttpClient. 

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

J'aimerai savoir combien de fois il continuera d'essayer. En regardant le code source je n'ai pas vu de limite maximum. Comment configurer le client pour qu'il arrête d'essayer après quelques tentatives?

13
RajV

Il y a plus de documents ici https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.Builder.html#retryOnConnectionFailure-boolean-

Configurez ce client pour réessayer ou non lorsqu'un problème de connectivité est rencontré. Par défaut, ce client récupère en mode silencieux à partir du fichier problèmes suivants:

  • Adresses IP inaccessibles. Si l'hôte de l'URL a plusieurs adresses IP, l'impossibilité d'atteindre une adresse IP individuelle n'échoue pas la demande globale. Cela peut augmenter la disponibilité des services multi-hébergés. 
  • Connexions mises en pool obsolètes. ConnectionPool réutilise les sockets pour réduire le temps de latence des requêtes, mais ces connexions expirent parfois.

  • Serveurs proxy inaccessibles. Un ProxySelector peut être utilisé pour essayer plusieurs serveurs proxy en séquence, pour finalement revenir à une connexion directe.

Définissez-la sur false pour éviter de réessayer les demandes, car cette opération est destructive. Dans ce cas, l'application appelante doit effectuer sa propre récupération des échecs de connectivité.

Mais généralement, je pense qu’il est prévu de réessayer lorsqu’il existe une connexion obsolète ou d’autres chemins qui peuvent être retentés. Ne pas réessayer exactement la même chose indéfiniment. 

Voir aussi ConnectionSpecSelector.connectionFailed

8
Yuri Schimke

J'ai fait une solution de contournement ci-dessous:

@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
Liangliang Sha

Il n'y a pas de méthode intégrée pour définir la limite maximale, mais vous pouvez ajouter un intercepteur comme ci-dessous.

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

Plus de détails sur les interceptos peuvent être trouvés ici .

2
Prerak Sola

OkHttp va potentiellement répéter vos demandes sur une connexion lente/peu fiable "de manière agressive" jusqu'à ce qu'elle aboutisse. Ceci est fait pour GET, POST ou tout autre type de requête

0
Rajesh Nasit