httpclient - 请求重试 Apache HttpClient 之间的超时

标签 httpclient apache-httpclient-4.x apache-commons-httpclient

有人可以分享如何配置现代 HttpClient 4.5.3 以重试失败的请求并在每次重试前等待一段时间吗?

到目前为止,我似乎正确理解了 .setRetryHandler(new DefaultHttpRequestRetryHandler(X, false))将允许重试请求 X 次。

但我不明白如何配置退避:.setConnectionBackoffStrategy()/.setBackoffManager()根据 JavaDocs 规范其他内容,而不是重试之间的超时。

最佳答案

关于动态延迟,我想提出以下建议:

CloseableHttpClient client = HttpClientBuilder.create()
    .setRetryHandler(new HttpRequestRetryHandler() {
        @Override
        public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
            return executionCount <= maxRetries ;
        }
    })
    .setServiceUnavailableRetryStrategy(new ServiceUnavailableRetryStrategy() {
        int waitPeriod = 100;
        @Override
        public boolean retryRequest(HttpResponse response, int executionCount, HttpContext context) {
            waitPeriod *= 2;
            return executionCount <= maxRetries &&
               response.getStatusLine().getStatusCode() >= 500; //important!
        }

        @Override
        public long getRetryInterval() {
            return waitPeriod;
        }
    })
    .build();

附录:
请注意,如果出现超时、端口未打开或连接关闭等 IO 错误,则不会调用 ServiceUnavailableRetryStrategy.retryRequest。在这种情况下,只会调用 HttpRequestRetryHandler.retryRequest ,并且重试将立即发生或在固定延迟后发生(我最终无法澄清这一点)。所以oleg的答案实际上是正确的。在 HttpClient 4.5 的支持下无法做到这一点。

(我实际上想将其称为设计错误,因为在现代微服务环境中,IO 错误后的延迟重试至关重要。)

关于httpclient - 请求重试 Apache HttpClient 之间的超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48541329/

相关文章:

c++ - libcurl 多接口(interface)单一简易接口(interface)多请求

java - 如何使用简单的字符串调用 SOAP 网络服务(字符串格式的 xml)

java - 登录网页具有隐藏 token ,该 token 在提交表单时以 POST 形式发送。如何在 Java HttpPost 中使用 token ?

java - org.apache.http.ProtocolException : Target host is not specified

java - 从 httpclient 3 转换为 httpclient 4(Cookie 策略)

java - useSystemProperties() 不适用于 Apache HttpClientBuilder.create() 版本 4.5.6

java - 如何将 UrlEncodedFormEntity 添加到 MultipartEntityBuilder

java - HttpClientBuilder 基本认证

java - 如何在 JAVA 中的 HTTP post 中传递当前的 Windows 用户凭据?

java - Apache Commons HttpClient PostMethod 支持吗?