OkHttpClient是否具有最大重试次数

时间:2016-06-17 13:53:29

标签: android okhttp okhttp3

我正在为OkHttpClient设置重试连接失败选项。

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

我想知道它会继续尝试多少次。看source code我没有看到任何最大限​​制。如何将客户端配置为在几次尝试后停止尝试?

5 个答案:

答案 0 :(得分:8)

此处有更多文档https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.Builder.html#retryOnConnectionFailure-boolean-

  

配置此客户端是否在连接问题时重试   遇到。默认情况下,此客户端以静默方式从中恢复   以下问题:

     
      
  • 无法访问的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;