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
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)