Не OkHttpClient иметь максимальное количество повторов
Я устанавливаю опцию повтора при сбое соединения для OkHttpClient.
client = new OkHttpClient();
client.setRetryOnConnectionFailure(true);
Я хотел бы знать, сколько раз он будет стараться. Глядя на исходный код Я не видел никакого максимального предела. Как настроить клиент, чтобы прекратить попытки после нескольких попыток?
4 ответов
здесь больше документов https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.Builder.html#retryOnConnectionFailure-boolean-
настройте этот клиент для повторной попытки или нет, когда проблема подключения встречающийся. По умолчанию этот клиент молча восстанавливает следующие проблемы:
- недостижимые IP-адреса. если хост URL имеет несколько IP-адресов, неспособность достичь какого-либо отдельного IP-адрес не завершает общий запрос. Это может повысить доступность многоузловых услуг.
устаревшие объединенные соединения. ConnectionPool повторно использует сокеты, чтобы уменьшить задержку запроса, но эти соединения иногда будут тайм-аут.
недоступные прокси-сервера. ProxySelector может использоваться для последовательной попытки нескольких прокси-серверов, в конечном итоге возвращаясь к прямому соединение.
установите значение false, чтобы избежать повторной попытки запросов, когда это разрушительно. В этом случае вызывающее приложение должно выполнить собственное восстановление сбоев подключения.
но в целом, я считаю, что он предназначен для повторной попытки, когда есть существующее устаревшее соединение или альтернативные пути, которые можно повторить. Не повторять одно и то же бесконечно.
Также см. ConnectionSpecSelector.connectionFailed
Я сделал обходной путь ниже:
@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;
}
нет встроенного метода для установки максимального предела, но вы можете добавить перехватчик, как показано ниже.
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;
}
});
более подробную информацию о interceptos можно найти здесь.
OkHttp потенциально повторит ваши запросы на медленном / ненадежном соединении "агрессивно", пока это не удастся. Это делается для GET, POST или любого другого типа запросов