java - 重试 http 连接

标签 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;
}

我最担心的是连接处于某种在后续重试时无效的状态。换句话说,我是否需要完全重新创建“httpRequest”,是否应该避免在 catch block 中调用 httpRequest.abort(),而只在最终失败时调用它?

谢谢

最佳答案

文档没有提到会发生这样的事情,尽管您必须尝试一下。不过,更重要的是,您应该在代码中考虑一些事项...

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

关于java - 重试 http 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3929748/

相关文章:

java - 云配置收到请求执行错误。端点=默认端点{ serviceUrl='http ://localhost:8761/} from Eureka server

java - 如何使用jSTL获取jsp中日历类型方法中设置的日期?

java - 在转换方法中从 Map 接收带有 String 键的对象

Android Wear 嵌入式应用与配套应用

java - 如何防止随机问题重复

java - 将 bundle 中的旋转器项目从一项 Activity 移动到另一项 Activity

android - 经过验证的 cordova 应用程序可以验证应用程序内的 Web View 吗?

java - 在 docker 容器中部署简单的独立 spring mvc 应用程序

java - 使用 spring 和 jwt 的 OAUTH2 服务器

java - 无法调用资源(特别是字符串数组) - java/android