目前,我正在用JDK-11的新Http库替换现有的org.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中没有设置重试的选项。有什么解决方法吗?
已经将重试从 Spring Batch 分解为一个单独的、独立的库,你可以使用(尽管是在 Spring 项目中(。它将允许您将重试策略添加到调用新 HTTP 客户端的方法。请参阅下面的文档:
https://github.com/spring-projects/spring-retry
这是我所知道的这种情况最接近的事情。如果你想自己动手,你也可以在方面完成同样的事情。我认为 Spring 库更干净,因为您可以让库处理重试的细节。它们还有一组强大的 API,用于不同的重试策略,包括指数退避等。
默认情况下,java.net.http HttpClient 将重试一次幂等请求 (GET/HEAD(。这在 HTTP/1.1 长实时连接上通常很有用,其中服务器端可能会任意决定连接保持空闲时间过长,并在客户端将其从池中取出并开始发送新请求的同时关闭它。