由于网络连接本身是不稳定的,所以引出了一系列问题:HttpClient是否有默认的重试策略?重试策略原理是什么?如何禁止重试呢?

1、DefaultHttpRequestRetryHandler介绍

HttpClient默认的重试执行类是DefaultHttpRequestRetryHandler,其重试策略是:

(1)如果重试超过3次,则不再重试;
(2)几种特殊异常及其子类,不进行重试,这些异常包括:InterruptedIOException、UnknownHostException、ConnectException、SSLException,发生这4中异常不重试
(3)同一个请求在异步任务中已经被终止,则不进行重试
(4)幂等的方法可以进行重试,比如get方法
(5)post方法在socket对应的输出流没有被write并flush成功时可以重试3次。
(6)如果请求没有发送成功,可以进行重试。

2、不重试异常的分析

InterruptedIOException,线程中断异常
UnknownHostException,找不到对应host
ConnectException,找到了host但是建立连接失败。
SSLException,https认证异常

另外,我们还经常会提到两种超时:连接超时与读超时:

java.net.SocketTimeoutException: Read timed out
java.net.SocketTimeoutException: connect timed out

这两种超时都是SocketTimeoutException,继承自InterruptedIOException,属于上面的第1种线程中断异常,不会进行重试。

3、如何禁止重试?

在构建httpClient实例的时候手动禁止掉即可。见下面的源码:

public final HttpClientBuilder disableAutomaticRetries() {
        automaticRetriesDisabled = true;
        return this;
}

4、参考

http://www.importnew.com/28669.html
https://www.cnblogs.com/kingszelda/p/8886403.html