有人可以解释一下这两者之间有什么区别吗:
client = HttpClientBuilder.create()
.setConnectionTimeToLive(1, TimeUnit.MINUTES)
.build();
and
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30 * 1000).build();
client = HttpClientBuilder
.create()
.setDefaultRequestConfig(requestConfig)
.build();
是不是比较好用setSocketTimeout()
?
A ConnectTimeout
确定创建新连接时等待对方回答“是的,我在这里,让我们谈谈”的最长时间(ConnectTimeout
最终打电话socket.connect(地址,超时) https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#connect(java.net.SocketAddress,%20int)。等待时间通常不到一秒,除非对方真的忙于接受新的传入连接,或者您必须穿过中国的防火墙。在后一种情况下,可能需要一分钟(或更长时间)才能创建新连接。如果连接未在指定时间内建立ConnectTimeout
,您会收到错误 (1)。
setSocketTimeout
最终打电话socket.setSoTimeout https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setSoTimeout(int)这是在中解释的这个答案 https://stackoverflow.com/q/12820874/3080094.
The ConnectionTimeToLive
确定连接的最长使用期限(超过该期限将关闭连接),无论上次使用连接的时间如何。通常,有一个“空闲超时”来清理连接,即您或另一方将关闭一段时间不使用的连接。通常,您将在另一方之前关闭空闲连接以防止错误。但我可以想到另外两种情况,连接的最长期限是有用的:
- 糟糕的网络组件:如果您还没有遇到过它们,那您就很幸运了。一些不良的路由器、防火墙、代理等会在大约 30 分钟后断开(正在使用的)连接。由于您和另一方甚至可能不知道连接已断开,因此您可能会在奇怪的时间无明显原因地收到“连接重置”错误。
- 缓存元数据:大多数系统在某种缓存中保存有关连接的一些元数据。有些系统对缓存的管理很差——缓存大小随着连接的使用时间而增长。
关于ConnectionTimeToLive
Apache HttpClient 4.5.4 中的实现:我认为你必须使用PoolingHttpClientConnectionManager https://hc.apache.org/httpcomponents-client-4.5.x/httpclient/apidocs/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.html为了使该选项起作用(最终一切都归结为调用this isExpired https://github.com/apache/httpcomponents-core/blob/4.4.9/httpcore/src/main/java/org/apache/http/pool/PoolEntry.java#L167方法)。如果您不使用此连接管理器,请测试该选项以确保它确实有效。
(1) EJP user207421 的有趣评论这个相关答案 https://stackoverflow.com/a/4969781/3080094
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)