4

目前我正在用JDK-11的新Httporg.apache.http.*库替换现有的http 客户端库。有许多令人兴奋的新功能,但是我没有找到关于“如何在新的 HTTPClient 中设置 RetryRequestHandler”的任何内容。以前的 Apache HttpClient 构建器的代码片段:

    ...
    ...
    HttpClientBuilder httpClientBuilder = HttpClientBuilder.create()
            .setDefaultRequestConfig(config)
            .setConnectionManager(connectionManager)
    if(retryCount > 0) {
        httpClientBuilder.setRetryHandler(new RetryRequestHandler(retryCount, url));
    }
    if (proxyHost) {
        HttpHost proxy = new HttpHost(proxyHost, proxyPort, "http");
        httpClientBuilder.setProxy(proxy);
    }
    ...
    ...

这里的 RetryRequestHandler 是 DefaultHttpRequestRetryHandler 的扩展

public class RetryRequestHandler extends DefaultHttpRequestRetryHandler{...} 

在 java-11 的新 HttpClient 中没有设置重试的选项。有什么解决方法吗?

4

2 回答 2

1

Spring 将 Spring Batch 的重试拆分为一个单独的独立库,您可以使用它(尽管在 Spring 项目中)。它将允许您向调用新 HTTP 客户端的方法添加重试策略。请参阅下面的文档:

https://github.com/spring-projects/spring-retry

这是我所知道的最接近这种情况的事情。如果你想自己动手,你也可以用方面来完成同样的事情。我认为 Spring 库更干净,因为您可以让库处理重试的细节。他们还拥有一组强大的 API,用于不同的重试策略,包括指数退避等。

于 2019-02-13T04:55:58.977 回答
0

java.net.http HttpClient 默认会重试一次幂等请求(GET/HEAD)。这通常在 HTTP/1.1 长连接中很有用,在这种连接中,服务器端可能会任意决定连接保持空闲太长时间,并在客户端将其从池中取出并开始发送新请求的同时关闭它.

于 2019-02-13T10:37:05.760 回答