【问题标题】:java: apache HttpClient > how to disable retryjava: apache HttpClient > 如何禁用重试
【发布时间】:2010-02-18 01:56:28
【问题描述】:

我在网站上使用 Apache Httpclient 进行 Ajax 调用。在某些情况下,对外部 Web 服务的请求会失败,通常是:

处理请求时捕获的 I/O 异常 (java.net.ConnectException):连接超时:连接。

在这种情况下,我通常想跳过重试请求(Httpclient 似乎自动执行的操作)。

但是,我找不到任何方法、参数等来跳过重试。

有人吗?

感谢 Geert-Jan

【问题讨论】:

    标签: java httpclient


    【解决方案1】:

    从 httpclient 4.3 开始使用 HttpClientBuilder

    HttpClientBuilder.create().disableAutomaticRetries().build();
    

    【讨论】:

      【解决方案2】:
      client.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false));
      

      这样就可以了。

      【讨论】:

      • 今天这不能编译,需要使用 jdigital 提到的文档 => client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(0, false));嗯,但它仍然不起作用
      • 它对我不起作用。我试过 ((AbstractHttpClient) httpclient).setHttpRequestRetryHandler(myRetryHandler);它似乎工作!
      • 不起作用,可能是因为在PoolingClientConnectionManager中使用?
      • client.setHttpRequestRetryHandler(..) 适用于 Android,由于 httpclient on Android - 4.0-beta1 的版本,Android 上无法识别 HttpMethodParams。
      【解决方案3】:

      好的。文档中有问题。 API和方法也发生了变化。 所以如果你想使用 DefaultHttpRequestRetryHandler ,这里有一些方法,

      DefaultHttpClient httpClient = new DefaultHttpClient();
      DefaultHttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(0, false);
      httpClient.setHttpRequestRetryHandler(retryHandler);
      

      HttpClient httpClient = new DefaultHttpClient();
      DefaultHttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(0, false);
      ((AbstractHttpClient)httpClient).setHttpRequestRetryHandler(retryHandler);
      

      在第一个中,我们使用具体的 DefaultHttpClient(它是 AbstractHttpClient 的子类,因此有 setHttpRequestRetryHandler() 方法。)

      在第二个中,我们正在对 HttpClient 接口进行编程(遗憾的是,它没有公开该方法,这很奇怪!!嗯),所以我们必须做那个讨厌的演员。

      【讨论】:

        【解决方案4】:

        HttpClient tutorial中有描述。

         client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
                   new DefaultHttpMethodRetryHandler());
        

        有关更多信息,请参阅tutorial,例如,如果请求有副作用(即不是幂等的),这可能是有害的。

        【讨论】:

          【解决方案5】:

          不需要强制转换为 AbstractHttpClient。另一种方法是使用AutoRetryHttpClient 的策略,将DefaultServiceUnavailableRetryStrategy 设置为0 作为重试参数。更好的方法是扩展 AbstractHttpClient 或实现 HttpClient 以公开所需的方法。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-05-24
            • 1970-01-01
            • 2023-02-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多