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,则日志可能是这样的
package com.primeton.mq.test
importcom.primeton.mq.service.DemoService
importorg.apache.cxf.endpoint.Client
importorg.apache.cxf.jaxws.JaxWsProxyFactoryBean
importorg.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory
importorg.apache.cxf.transport.http.HTTPConduit
importorg.apache.cxf.transports.http.configuration.HTTPClientPolicy
publicclassdemo{
publicstaticvoid main(String[] args) {
//创建动态客户端
JaxWsDynamicClientFactoryfactory =JaxWsDynamicClientFactory.newInstance()
Clientclient = factory.createClient("http://localhost:8090/demo/api?wsdl")
// 需要密码的情况需要加上用户名和密码
//client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,PASS_WORD))
HTTPConduitconduit = (HTTPConduit) client.getConduit()
HTTPClientPolicyhttpClientPolicy = newHTTPClientPolicy()
httpClientPolicy.setConnectionTimeout(2000)//连接超时
httpClientPolicy.setAllowChunking(false)//取消块编码
httpClientPolicy.setReceiveTimeout(120000)//响应超时
conduit.setClient(httpClientPolicy)
//client.getOutInterceptors().addAll(interceptors)//设置拦截器
try{
Object[] objects = newObject[0]
// invoke("方法名",参数1,参数2,参数3....)
objects = client.invoke("sayHello","sujin")
System.out.println("返回数据:"+ objects[0])
}catch(Exceptione){
e.printStackTrace()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)