Apache HttpClient:setConnectTimeout() 与 setConnectionTimeToLive() 与 setSocketTimeout()

2024-02-06

有人可以解释一下这两者之间有什么区别吗:

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 分钟后断开(正在使用的)连接。由于您和另一方甚至可能不知道连接已断开,因此您可能会在奇怪的时间无明显原因地收到“连接重置”错误。
  • 缓存元数据:大多数系统在某种缓存中保存有关连接的一些元数据。有些系统对缓存的管理很差——缓存大小随着连接的使用时间而增长。

关于ConnectionTimeToLiveApache 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(使用前将#替换为@)

Apache HttpClient:setConnectTimeout() 与 setConnectionTimeToLive() 与 setSocketTimeout() 的相关文章

随机推荐

  • 发现蓝牙设备IOError:RPC服务器不可用

    我只是尝试在 PyCharm 中使用 Python 实现蓝牙PyBluez http karulis github io pybluez 我陷入了这个特殊的错误 我试图搜索这个错误 但找不到它 有人可以帮忙吗 这是我的代码 gt gt gt
  • 使用 Facebook (PHP SDK) 和 Codeigniter 进行身份验证

    好吧 这几天我一直在尝试将 Facebook 身份验证集成到我基于 Codeigniter 的网站中 我已将 Facebook PHP SDK 作为一个库包含在内 并且似乎连接得很好 但是当我在 SDK 中使用 getUser 方法时 会返
  • 如何拥有一个显示不同uitableview建议的搜索栏

    我想在导航栏上有一个搜索栏 当用户开始输入时 显示一些建议 但另外 uitableview 必须与搜索结果不同 例如 用户开始输入 wh 然后显示一个包含white wheater who 的列表 然后 当按下搜索按钮时 会显示其他列表和结
  • Safari 浏览器的媒体查询

    我希望媒体仅在 1280 像素屏幕的 Safari 上运行 这适用于所有浏览器 但我只想要 safari media screen and width 1280px Try this Webkit Chrome 和 Safari 任何版本
  • Android 人脸检测仅适用于绘图,不适用于 SD 卡中的图像

    所以我有代码可以在任何给定的图像文件中检测最多 10 张面孔 并向我返回信息 例如眼睛的位置和其他类似信息 因此 当我告诉它使用存储在我的项目资源的可绘制文件夹中的图像文件时 它效果很好 但是当我尝试从 SD 卡导入的位图中查找面孔时 它不
  • 高分自包含在 .xap 中

    想知道这是否可能 我正在为一个有趣的办公项目制作一个小游戏 并且需要有一个高分表 该表独立于实际的 Silverligth xap 中 有办法做到这一点吗 不 不是 您可以将表存储为数据 即在 XML 文件中 但您无法修改该文件并在 XAP
  • 无法一次选择一个单选按钮

    我无法一次选择一个单选按钮 多个按钮被选中 我是 html 新手 这是我的代码 请帮忙
  • ColdFusion 从文本文件中提取值

    技术细节 我想从包含参数名称和值的文本文件中提取值 对于以 request config 开头的每一行 有空行 带注释的行等 我不想从中提取任何内容 我想提取这些值 以粗体显示 请求 配置 我的参数1 一些随机字符串 我认为最好的方法可能是
  • 计算点之间的距离

    我正在尝试使用 Scala 类计算两点之间的距离 但它给出了一个错误说 类型不匹配 找到 other type 具有基础类型 Point required def x 请注意 隐式转换不是 适用 因为它们不明确 两种方法any2Ensuri
  • 从 SQL Server 表中随机选择 n 行

    我有一个 SQL Server 表 其中包含大约 50 000 行 我想随机选择其中大约 5 000 行 我想到了一种复杂的方法 创建一个带有 随机数 列的临时表 将我的表复制到其中 循环遍历临时表并用RAND 然后从该表中选择随机数列 本
  • 使用参数的 Xamarin Forms 应用程序链接

    我有个问题 我想从我的 php 页面启动我的应用程序并通过该链接传递一个变量 然后在我的应用程序网站上 我需要读取参数并使用该参数执行我想要的操作 现在我已经找到这个链接 Xamarin Android 使用带参数的链接启动应用程序 htt
  • 如何将完整的字符串写入文件?

    我现在正在 Windows 中编程 但可移植代码也将受到欢迎 我现在使用的是fwrite 4 但此函数需要写入文件的最大元素数 我可以用strlen 1 在这里 但我想知道是否有更好的方法来做到这一点 Use fputs http www
  • Flutter:- 如何在屏幕上显示动态小部件?

    我想以乱码形式显示输入的文本 即单词的每个字母需要单独显示Container连续 为此 我正在接受文本输入 并将其存储在List
  • NHibernate 不只保存一个属性

    我正在尝试更新表中的单个列 没有发出任何更新 使用 SQL Profiler 检查 没有错误 类映射有dynamic update true 类上未启用版本控制 刷新模式提交 映射的属性没有任何插入 更新修饰符
  • .NET core/Python 从 Azure 存储 Blob 读取前 X 行

    我有一个大斑点 我需要从中提取前几行 我可以在不打开整个文件的情况下执行此操作吗 该文件采用已知格式 通常为 Excel 有时为 csv 或 tsv 只要知道这是否可能就会非常有帮助 在搜索微软和其他论坛时 我根据日期得到了不同的答案 谢谢
  • 在 Mac OS 上从 Transformer 类导入管道函数时,Jupyter 内核崩溃

    我无法导入 Transformer 类的管道函数 因为我的 jupyter 内核一直死机 尝试使用 Transformer 4 15 0 和 4 16 2 有人遇到过这个问题吗 我尝试将类导入到新笔记本中 如图所示 它不断杀死内核 这对我来
  • 检查 DataFrame(Scala) 是否为空的最快方法?

    如何检查 DataFrame Scala 以最快的方式为空 我用DF limit 1 rdd isEmpty 比 DF rdd isEmpty 更快 但并不理想 有没有更好的方法可以做到这一点 我通常会打电话给first围绕一个Try im
  • Git 合并因分段错误而失败

    我有一个大型合并 涉及很多inexact rename 但失败并出现以下情况 Performing inexact rename detection 100 169817200 169817200 done Performing inexa
  • 将 RTSP 流转换为 HTTP 并使用 VLC 客户端进行流传输

    我有一个通过 RTSP 提供流的 IP 摄像机 我可以使用以下 URL 在带有 VLC 播放器的 PC 上播放它 rtsp 192 168 1 52 554 user admin password channel 1 stream 0 sd
  • Apache HttpClient:setConnectTimeout() 与 setConnectionTimeToLive() 与 setSocketTimeout()

    有人可以解释一下这两者之间有什么区别吗 client HttpClientBuilder create setConnectionTimeToLive 1 TimeUnit MINUTES build and RequestConfig r