HttpClient连接池及重试机制是什么


本篇内容介绍了“HttpClient连接池及重试机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,基于标准的java语言。支持HTTP和HTTPS协议实现了HTTP的方法,GET,POST,PUT,DELETE等方法。连接管理器支持多线程的应用。可以设置连接超时使用HttpClient发送请求,接收响应可以分为一下几步:创建HttpClient对象创建请求方法的实例,并且指定URL发送请求参数,GET请求和POST请求发送参数的方式有所不同调用HttpClient对象的execute方法,返回HttpResponse对象调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容连接释放。无论成功与否,必须释放连接笔者用到的版本是4.5.5,由于是maven工程,需要在pom文件引入对应的坐标。代码中出现了@Slf4j,作用是引入log,手动打印日志。这个注解是lombok的注解。解释一下,什么是Route?Route的概念可以理解为客户端机器到目标机器的一条线路,例如使用HttpClient的实现来分别请求 www.163.com 的资源和 www.sina.com 的资源就会产生两个route。缺省条件下对于每个Route,HttpClient仅维护2个连接,总数不超过20个连接。1 为什么要使用http连接池?延迟降低,如果不使用连接池,每次发起的http请求都会重新建立tcp连接(三次握手),用完就会关闭连接(4次握手),采用连接池则会减少这不是分时间的消耗。连接池管理的对象都是长连接。支持更大的并发,由于连接池只适用于请求经常访问同一主机(或同一端口的情况),连接池避免了反复建立连接,抢占端口资源的情况,如果没用连接池,可能导致连接建立不了。2 设置超时时间首先要明白三个概念:socketTimeout,connectTi免费云主机域名meout,connectionRequestTimeout。socketTimeout:客户端和服务器读取数据的timeoutconnectTimeout:客户端和服务器建立连接的timeoutconnectionRequestTimeout:从连接池获取连接的timeout3 解释:一次http请求一次http请求,必定会有三个阶段,一:建立连接;二:数据传送;三,断开连接。当建立连接在规定的时间内(ConnectionTimeOut )没有完成,那么此次连接就结束了。后续的SocketTimeOutException就一定不会发生。只有当连接建立起来后,也就是没有发生ConnectionTimeOutException ,才会开始传输数据,如果数据在规定的时间内(SocketTimeOut)传输完毕,则断开连接。否则,触发SocketTimeOutException。上面说了这么多,就是为了引出下面的重试问题。由于项目中要访问外部接口,访问接口的时候,偶尔会出现SocketTimeOutException:Read timed out,其实就是客户端读取服务器的数据超时了。使用PoolingHttpClientConnectionManager得到的InternalHttpClient实例,是抽象类CloseableHttpClient的一个实现。看一下ClientExecChain接口的实现类简单看一下build()方法自上而下,创建了不同的ClientExecChain实例。注意:创建对象的顺序就是执行器链的顺序在构造CloseableHttpClient实例的时候,判断是否关闭了自动重试功能,automaticRetriesDisabled默认是false。如果没有指定执行器链,就用RetryExec。默认的重试策略是DefaultHttpRequestRetryHandler。如果重写了ServiceUnavailableRetryStrategy接口,或者使用了DefaultServiceUnavailableRetryStrategy,ServiceUnavailableRetryExec也会加入到执行器链里。同理,redirectHandlingDisabled默认是false,RedirectExec也会加入到执行器链,并且会最先执行。前面已经看到我们使用的HttiClient本质上是InternalHttpClient,这里看下他的执行发送数据的方法。首先经过RedirectExec,RedirectExec里面调用ServiceUnavailableRetryExec的excute(),进入ServiceUnavailableRetryExec后,调用RetryExec的excute(),进入发到RetryExec后,调用ProtocolExec的execute(),最后调用MainClientExec的excute()。执行器链结束后,执行HttpRequestExecutor的excute(),excute()方法调用了自己的doSendRequest()。之后一步一步的返回,遇到异常进行处理。下面是RetryExec发送请求的部分当发生IOException,判断是否要重试。如果重试则记录相应的次数,如果不重试,就抛出异常并且退出。通过构造函数,可以看出:重试3次请求成功,就不再重试InterruptedIOException、UnknownHostException、ConnectException、SSLException,发生这4种异常不重试重试3次请求成功,就不再重试InterruptedIOException、UnknownHostException、ConnectException、SSLException,发生这4种异常不重试 关于默认的重试策略如果超过三次不进行重试以上4中异常及其子类不进行重试同一个请求在异步任务中已经停止,不进行重试幂等的方法可以进行重试,比如get,含有http body都可以认为是非幂等请求没有发送成功,可以进行重试问题来了,发送成功的请求是怎么样的?下面的代码在HttpCoreContext里面,HttpCoreContext是HttpContext的实现类当前httpContext中的http.request_sent设置为true,则认为已经发送成功。HttpRequestExecutor的excute(),调用了自己的doSendRequest()。判断是否携带实体的方法注:HttpEntityEnclosingRequest是一个接口HttpEntityEnclosingRequestBase是实现HttpEntityEnclosingRequest的抽象类下图可以看出,HttpPost和HttpPut是HttpEntityEnclosingRequestBase的子类简要分析一下,上述的操作过程开始将http.request_sent设置为false通过流flush数据到客户端然后将http.request_sent设置为true显然conn.flush()是可以发生异常的。注意:conn都是从连接池获取的。默认是开启重试的,可以在创建HttpClientBuilder的时候,调用下面的方法关闭。只有发生IOException才会发生重试InterruptedIOException、UnknownHostException、ConnectException、SSLException,发生这4种异常不重试get方法可以重试3次,post方法对应的socket流没有被flush成功时可以重试3次InterruptedIOException,线程中断异常UnknownHostException,找不到对应hostConnectException,找到了host但是建立连接失败SSLException,https认证异常另外,我们还经常会提到两种超时,连接超时与读超时:1. java.net.SocketTimeoutException: Read timed out2. java.net.SocketTimeoutException: connect timed out这两种超时都是SocketTimeoutException,继承自InterruptedIOException,属于线程中断异常,不会进行重试。“HttpClient连接池及重试机制是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!

相关推荐: python中删除列表元素del,pop(),remove()及clear()怎么用

这篇文章主要介绍python中删除列表元素del,pop(),remove()及clear()怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!del 不是方法,是 Python 中的关键字,专门用来执行删除操作,它不仅可以删除整个列…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 01/09 12:56
下一篇 01/09 12:57

相关推荐