当前位置: 首页 > 知识库问答 >
问题:

当出站流被远程故障中断时,Apache HTTPClient忽略超时配置?

曹新觉
2023-03-14

我在主机a上有一个客户端,使用Apache HTTPClient(4.2.5)将消息发布到主机B上的服务器。在主机a上,我正在以(我认为是)推荐的方式设置连接和读取/套接字超时:

client = new DefaultHttpClient();
params = client.getParams();
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 20000);

我试图测试在部分但不是全部数据流传输后客户端传输突然终止(例如,主机B上的目标服务器崩溃)的情况下的超时行为。因此,我的测试方法是:

  1. 从主机A上的客户端应用程序启动HTTP POST
  2. 日志显示客户端已调用基础Apache HTTPClient框架后不久,在主机B上启用防火墙规则来阻止来自主机A的流量。

我可以确认(通过数据包捕获)测试实际上是在中途切断请求数据。

我本以为客户端应用程序会在读取超时间隔(20秒)后超时,但我看到的是客户端在最终遇到连接超时之前挂起更长的间隔(500-600秒范围内)。

有人能解释一下(如果没有解释,就大胆猜测一下)为什么客户端忽略了我指定的超时吗?在这种情况下,有没有办法强制执行超时?

共有2个答案

司寇凯
2023-03-14

因此,超时属性适用于通过DNS解析获得的每个地址。例如abc.come解析为4个不同的ip地址,你设置了10秒的超时。因此,在超时之前,您的请求将总共等待4 x 10=40秒。

孙成化
2023-03-14

不确定为什么不工作,但您可以尝试另一种方法,在实例化HttpClient之前创建Params对象。

大意的东西:

HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 20000);
HttpClient httpClient = new DefaultHttpClient(params);

每个超文本传输协议消息都有一组唯一的参数,这些参数将覆盖客户端连接对象的设置。您可能需要检查他们是否自己指定超时,从而使您设置的超时未被使用(除非明确设置,否则不应该发生,但值得检查)

此外,您可以尝试自己在HttpGet或HttPost对象上明确设置这些参数,看看这是否会改变行为。

 类似资料:
  • 我的Java代码使用共享的ApacheHttpClient 4.4。1.我将每个POST请求级别上的连接超时、套接字超时和连接请求超时设置为100毫秒。它大部分时间都很好用。然而,在大量请求(压力测试)时,HttpClient忽略这些超时;请求可能需要20秒或更长时间。这是我的密码: 在某些情况下,我会得到如下日志记录: 2018-10-26 14:18:45496[my-thread-1]调试c

  • 如果 Flarum 无法安装或者是没有按照预期运行,第一件需要做的事情就是再次检查你的环境是否达到了系统要求。如果你缺失部分 Flarum 的依赖项(例如 PHP 的 fileinfo 扩展),你将需要先处理这些问题。 接下来,你应该花上几分钟在支持论坛和问题追踪器内检索。有可能有人已经汇报了这个问题,或者解决方案正在讨论,或者已经有解决方案。在检索过后,如果你仍然没有发现关于这个问题的信息的话,

  • 我有以下Spring Integration JAva DSL代码: 创建为的bean。 我试图实现的是,当SOAP错误到达时,将错误消息路由到错误通道。我认为我可以向处理程序添加一个建议,这个建议应该是,我可以在其中设置失败通道。因此,每当出站网关中抛出错误时,错误消息将被转发到错误通道。 我将trapExecution设置为false,直接将通知添加到网关,并且必须使用,否则流将挂起。所以现在

  • 我们有一个mongodb副本设置,包含两个成员和一个仲裁器: db1-primary db2-secondary 仲裁者 我假设它可以检查返回到集合的服务器,而不会阻止其他db值。 有什么想法或为什么会发生这种情况?或改善行为的方法?

  • 当kafka streams应用程序运行且kafka突然停机时,应用程序进入“等待”模式,发送警告日志的消费者和生产者线程无法连接,当kafka恢复时,一切(理论上)都应该恢复正常。我正在尝试获取有关此情况的警报,但我无法找到捕获该警报的位置并发送日志/度量。我尝试了以下方法: 但这只发生在异常情况下,而不是这里 扩展并将属性更改为我的类,从而扩展了此接口。 我知道Kafka有自己的衡量标准,我可

  • 本文对 TiDB 集群在使用中遇到的常见问题及故障提供诊断及处理说明。 各类故障诊断 参阅 TiDB 集群故障诊断常见问题及其他内容。