【问题标题】:JAVA-11: java.net.httpClient How to set Retry?JAVA-11: java.net.httpClient 如何设置重试?
【发布时间】:2019-07-06 20:18:51
【问题描述】:

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

    ...
    ...
    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 中没有设置重试的选项。有什么解决方法吗?

【问题讨论】:

  • 我怀疑默认的 JDK 实现中是否有任何 retry 功能。
  • 您的代码看起来不像 Java 11 http 客户端。相反,它似乎使用 Apache HttpClient:DefaultHttpRequestRetryHandler
  • @robert 以前 httpclient builder 的代码 sn-p
  • @ruhul 你最终实施了什么解决方案?

标签: java httpclient java-11 java-http-client


【解决方案1】:

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

【讨论】:

  • 感谢您的信息。但我正在寻找一些实现,我可以附加一个重试处理程序,它会自动重试固定的时间,以防超时或特定异常。
  • 您可以通过向HttpClient::sendAsync 返回的CompletableFuture 注册一个异步相关操作来轻松做到这一点。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    相关资源
    最近更新 更多