httpclient参数配置

httpclient参数配置,第1张

这里简单解释一下httpclient一些关键参数的配置

httpclient默认提供了一个策略

默认的话,是从response里头读timeout参数的,没有读到则设置为-1,这个代表无穷,这样设置是有点问题了,如果是https链接的话,则可能会经常报

HTTP规范没有确定一个持久连接可能或应该保持活动多长时间。一些HTTP服务器使用非标准的头部信息Keep-Alive来告诉客户端它们想在服务器端保持连接活动的周期秒数。如果这个信息可用,HttClient就会利用这个它。如果头部信息Keep-Alive在响应中不存在,HttpClient假设连接无限期的保持活动。然而许多现实中的HTTP服务器配置了在特定不活动周期之后丢掉持久连接来保存系统资源,往往这是不通知客户端的。

这里可以在此基础上重写一个,这里设置为5秒

官方提供了一个实例

在spring cloud netflix zuul中则提供了类似的定时器,只不过参数是写死的

spring-cloud-netflix-core/1.2.6.RELEASE/spring-cloud-netflix-core-1.2.6.RELEASE-sources.jar!/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java

httpcore-4.4.6-sources.jar!/org/apache/http/pool/PoolEntry.java

主要看

httpclient-4.5.3-sources.jar!/org/apache/http/impl/execchain/ConnectionHolder.java

这里设置了validDuration,会传给releaseConnection

httpclient-4.5.3-sources.jar!/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.java

这里去updateExpiry,相当于更新了timeToLive

这里设置的是http连接池中connection的存活时间

httpclient-4.5.3-sources.jar!/org/apache/http/impl/client/HttpClientBuilder.java

httpclient-4.5.3-sources.jar!/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.java

4.0的ThreadSafeClientConnManager,在4.2版本的时候被废弃了,默认使用PoolingHttpClientConnectionManager。这个manager有两个重要的参数,一个是maxTotal,一个是defaultMaxPerRoute。

httpclient-4.5.3-sources.jar!/org/apache/http/conn/routing/HttpRoute.java

HttpRoute对象是immutable的,包含的数据有目标主机、本地地址、代理链、是否tunnulled、是否layered、是否是安全路由。

httpclient-4.5.3-sources.jar!/org/apache/http/impl/client/IdleConnectionEvictor.java

builder默认会构造一个IdleConnectionEvictor

httpclient-4.5.3-sources.jar!/org/apache/http/impl/client/HttpClientBuilder.java

如果没有指定maxIdleTime的话,但是有设置evictExpiredConnections的话,默认是10秒

设置从连接池获取一个连接的请求超时时间( 连接池中连接不够用的时候等待超时时间 ),单位毫秒,可以设置为500ms

httpclient-4.5.3-sources.jar!/org/apache/http/impl/execchain/MainClientExec.java

设置重试策略

httpclient-4.5.3-sources.jar!/org/apache/http/impl/client/DefaultHttpRequestRetryHandler.java

比如不重试,可以这样设置

当getKeepAliveDuration为-1以及connTimeToLive为-1的时候,closeExpiredConnections方法其实是没有用的,查看debug日志会出现

当getKeepAliveDuration不为-1的话,假设是5s,则日志可能是这样的

这样应该可以吧,

httpclient4自带的

HttpClientBuilder.create()

.setDefaultRequestConfig(config)

.setRetryHandler(new DefaultHttpRequestRetryHandler()) //默认失败后重发3次,可用别的构造方法指定重发次数

.build()

自己写的

int i = 0

while (true) {

CloseableHttpResponse response =null

try{

response = httpClient.execute(httpPost)

}catch(Exception e){

if(i>3){

break

}

i++

}

if (esponse!= null ) {

break

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11256428.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存