java: apache HttpClient > 如何禁用重试

Posted

技术标签:

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

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

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

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

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

有人吗?

感谢 Geert-Jan

【问题讨论】:

【参考方案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 以公开所需的方法。

【讨论】:

以上是关于java: apache HttpClient > 如何禁用重试的主要内容,如果未能解决你的问题,请参考以下文章

关于java httpclient编程的问题

使用 Java 和 apache HttpClient 的 Apache Shiro authcBasic 身份验证

java如何下载和安装org.apache.commons.httpclient的jar包?

Apache HTTPClient依赖问题:POM

Java 中使用 HttpClient 4.3.6 进行文件上传

HTTPClient "main" java.lang.NoSuchFieldError: org.apache.http.conn.ssl.SSLConnectionSocket