我正在为OkHttpClient设置重试连接失败选项。
client = new OkHttpClient();
client.setRetryOnConnectionFailure(true);
我想知道它会继续尝试多少次。看source code我没有看到任何最大限制。如何将客户端配置为在几次尝试后停止尝试?
答案 0 :(得分:8)
配置此客户端是否在连接问题时重试 遇到。默认情况下,此客户端以静默方式从中恢复 以下问题:
- 无法访问的IP地址。如果URL的主机有多个IP地址,则无法访问任何单个IP地址并不会使整个请求失败。这可以提高多宿主服务的可用性。
陈旧的池连接。 ConnectionPool重新使用套接字来减少请求延迟,但这些连接偶尔会超时。
无法访问的代理服务器。可以使用ProxySelector按顺序尝试多个代理服务器,最终回退到直接连接。
将此设置为false可避免在执行此操作时重试请求具有破坏性。在这种情况下,调用应用程序应该自己恢复连接失败。
但一般情况下,我认为当存在过时的连接或可以重试的备用路径时,它会重试。不要无限期地重试完全相同的事情。
另见ConnectionSpecSelector.connectionFailed
答案 1 :(得分:4)
我在下面做了一个解决方法:
@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;
}
答案 2 :(得分: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;
}
});
有关拦截器的更多细节可以找到here。
答案 3 :(得分:0)
OkHttp可能会“积极”在慢速/不可靠的连接上重复您的请求,直到成功为止。这是针对GET,POST或任何其他类型的请求完成的
答案 4 :(得分:0)
根据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;