java Apache HttpClient:setConnectTimeout()vs.setConnectionTimeOlive()vs.setSocketTimeout()
有人能解释一下这两者的区别吗:
client = HttpClientBuilder.create()
.setConnectionTimeToLive(1, TimeUnit.MINUTES)
.build();
及
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30 * 1000).build();
client = HttpClientBuilder
.create()
.setDefaultRequestConfig(requestConfig)
.build();
使用setSocketTimeout()
更好吗
# 1 楼答案
连接超时: 这是与服务器建立连接之前的超时
套接字超时: 这是等待数据包[数据]接收的非活动时间
setConnectionRequestTimeout:
但是,它是特定于配置连接管理器的。现在是从连接池获取连接的时间
它返回从连接管理器请求连接时使用的超时(以毫秒为单位)。表示无限(0)超时
setConnectionTimeToLive
示例:HttpClientStarter。爪哇
资源链接:
HttpClientStarter.java
HttpClient 4.x Timeout
HTTP规范不确定持续连接可以或应该保持活动状态的时间。一些HTTP服务器使用非标准头Keep-Alive告诉客户端他们希望在服务器端保持连接的秒数。如果此信息可用,HttClient将利用此功能。如果响应中不存在保持活动状态的标头信息,HttpClient将假定连接无限期保持活动状态。但是,许多真实世界的HTTP服务器被配置为在特定的非活动期后丢弃持久连接,以节省系统资源,通常不通知客户端
这里你可以重写一个,这里设置为5秒
连接逐出策略
HttpClient试图通过测试连接是否过期来缓解此问题,该连接不再有效,因为在使用发出HTTP请求的连接之前,它已在服务器端关闭。过时的连接检查不是100%稳定的,而是每个请求执行需要10到30毫秒。由于每个线程的非活动性都被认为是可用的,所以监视套接字模型的每个线程的非活动性都被认为是不可用的,因为该线程的非活动性并不是只用于回收已过期的连接。监视线程可以定期调用
ClientConnectionManager#closeExpiredConnections()
方法来关闭所有过期的连接,从连接池中退出已关闭的连接。它还可以选择调用ClientConnectionManager#closeIdleConnections()
方法来关闭所有空闲超过给定时间段的连接资源链接:
http://dev.dafan.info/detail/513285
# 2 楼答案
A
ConnectTimeout
确定在创建新连接时等待对方回答“是的,我在这里,让我们谈谈”的最长时间(ConnectTimeout
最终调用socket.connect(address, timeout)。等待时间通常不到一秒钟,除非对方真的忙于接受新的传入连接,或者你必须通过中国的防火墙。在后一种情况下,可能需要一分钟(或更长时间)才能创建新连接。如果未在ConnectTimeout
内建立连接,则会出现错误(1)setSocketTimeout
最终调用^{ConnectionTimeToLive
确定连接的最长使用期限(之后将关闭),而不管上次使用连接的时间是什么时候。通常,清理连接时会有一个“空闲超时”,即您或另一方将关闭一段时间未使用的连接。通常,您将在另一端关闭空闲连接之前关闭该连接,以防止出现错误。但我能想到的另外两种情况是,连接的最大年龄是有用的:关于ApacheHttpClient 4.5.4中的} 选项才能工作(最终都归结为对this ^{} 方法的调用)。如果您不使用此连接管理器,请测试该选项以确保它真正起作用
ConnectionTimeToLive
实现的一个注意事项:我认为必须使用^{(1)来自this related answer的
EJPuser207421的有趣评论