重试http连接

use*_*701 7 java android

我正在发出http请求.我在一个平台(android)上,网络操作经常失败,因为网络连接可能不会立即可用.因此,我想在完全失败之前尝试相同的连接N次.想到这样的事情:

DefaultHttpClient mHttp = ...;

public HttpResponse runHttpRequest(HttpRequestBase httpRequest) 
    throws IOException
{
    IOException last = null;
    for (int attempt = 0; attempt < 3; attempt++) {
        try {
            HttpResponse response = mHttpClient.execute(httpRequest);
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode == 200) {
                return response;
            }
        } catch (IOException e) {
            httpRequest.abort();
            last = e;
        }
    }

    throw last;
}
Run Code Online (Sandbox Code Playgroud)

我最担心的是某些状态下的连接在后续重试时无效.换句话说,我是否需要完全重新创建'httpRequest',我应该避免在catch块中调用httpRequest.abort(),并且只在最终失败时调用它吗?

谢谢

Mic*_*yan 8

文档没有提到会发生这样的事情,尽管你必须尝试它.但更重要的是,您的代码应考虑一些事项......

  1. 您可能应该公开重试次数,允许调用者指定此值.
  2. 您应该只在抛出异常时重试; 你现在重试,除非你得到200.但是,例如,如果你得到404 ...这并不意味着你的请求失败,因为网络没有失败......相反,你做了一个成功的回合 - 访问服务器,但服务器根本没有所请求的资源...所以在这种情况下重试真的没有意义.
  3. 按原样,您可以抑制各种不同类型的异常.记录列表中发生的所有异常并返回包含响应的某种结果对象(除非所有尝试都失败,否则可能为null)以及所有异常列表.否则,您从发生的异常集中抛出一些任意异常,可能会掩盖失败.
  4. 现在你只需要一遍又一遍地用同样的要求锤击......如果有拥堵,你只是加入它.如果您的IP地址被禁止进行太多活动,您可能会添加到那个...任何类型的重试逻辑应该具有退避行为,其中重试之间有一些等待时间并且该间隔随着每次失败.


Ben*_*enV 6

一个HttpRequestRetryHandler好像它可能会有所帮助在这里.