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?
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
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;
}
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 .
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