当前位置: 代码迷 >> java >> JAVA-11: java.net.httpClient 如何设置重试?
  详细解决方案

JAVA-11: java.net.httpClient 如何设置重试?

热度:39   发布时间:2023-07-27 09:38:32.0

目前我正在用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 已将 Spring Batch 的重试分解为一个单独的、独立的库,您可以使用它(尽管在 Spring 项目中)。 它将允许您向调用新 HTTP 客户端的方法添加重试策略。 请参阅以下文档:

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

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

  相关解决方案