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 和 apache HttpClient 的 Apache Shiro authcBasic 身份验证
java如何下载和安装org.apache.commons.httpclient的jar包?
Java 中使用 HttpClient 4.3.6 进行文件上传
HTTPClient "main" java.lang.NoSuchFieldError: org.apache.http.conn.ssl.SSLConnectionSocket