httpclient 超时时间

httpclient 超时时间,第1张

HttpClient中可设置三个超时:RequestTimeout(连接池获取到连接的超时时间)、ConnectTimeout(建立连接的超时)、SocketTimeout(获取数据的超时时间)。使用RequestConfig进行配置的示例程序如下:

这里简单解释一下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,则日志可能是这样的

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()

      }


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

原文地址: http://outofmemory.cn/zaji/7037087.html

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

发表评论

登录后才能评论

评论列表(0条)

保存