gpt4 book ai didi

java - Apache HttpClient : setConnectTimeout() vs. setConnectionTimeToLive() 与 setSocketTimeout()

转载 作者:搜寻专家 更新时间:2023-10-30 21:30:26 25 4
gpt4 key购买 nike

谁能解释一下这两者之间的区别:

client = HttpClientBuilder.create()
.setConnectionTimeToLive(1, TimeUnit.MINUTES)
.build();

RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30 * 1000).build();
client = HttpClientBuilder
.create()
.setDefaultRequestConfig(requestConfig)
.build();

使用 setSocketTimeout() 是否更好?

最佳答案

ConnectTimeout 确定在创建新连接时等待对方回答“是的,我在这里,让我们谈谈”的最长时间(ConnectTimeout 最终调用 socket.connect(address, timeout) 。等待时间通常不到一秒,除非对方真的忙于接受新的传入连接或者你必须通过中国的防火墙。在后一种情况下,它可能是一分钟(或更多)在创建新连接之前。如果未在 ConnectTimeout 内建立连接,则会出现错误 (1)。

setSocketTimeout 最终调用 socket.setSoTimeout这在 this answer 中有解释。 .

ConnectionTimeToLive 确定连接的最长期限(超过该期限后将关闭),而不管上次使用连接的时间。通常,有一个“空闲超时”来清理连接,即您或另一方将关闭一段时间不使用的连接。通常,您将在另一方关闭空闲连接之前关闭它以防止错误。但是我可以想到另外两种情况下连接的最长期限是有用的:

  • 糟糕的网络组件:如果您还没有遇到它们,那您就算幸运了。一些糟糕的路由器、防火墙、代理等将在大约 30 分钟后断开(正在使用的)连接。由于您和另一方可能甚至不知道连接已断开,因此您可能会在奇怪的时候无缘无故地收到“连接重置”错误。
  • 缓存的元数据:大多数系统在某种缓存中保留一些关于连接的元数据。一些系统对这种缓存的管理很糟糕 - 缓存大小只会随着连接的使用年限而增长。

关于 Apache HttpClient 4.5.4 中的 ConnectionTimeToLive 实现的注意事项:我认为您必须使用 PoolingHttpClientConnectionManager使选项生效(最终都归结为对 this isExpired 方法的调用)。如果您不使用此连接管理器,请测试该选项以确保它确实有效。

(1) EJP user207421 在 this related answer 上的有趣评论

关于java - Apache HttpClient : setConnectTimeout() vs. setConnectionTimeToLive() 与 setSocketTimeout(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31566851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com