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

Java 当出站流被远程故障中断时,Apache HTTPClient忽略超时配置?,java,http,apache-httpclient-4.x,connection-timeout,socket-timeout-exception,Java,Http,Apache Httpclient 4.x,Connection Timeout,Socket Timeout Exception,我在主机a上有一个客户端,使用Apache HTTPClient(4.2.5)将消息发布到主机B上的服务器。在主机a上,我正在以(我认为是)推荐的方式设置连接和读取/套接字超时: client = new DefaultHttpClient(); params = client.getParams(); HttpConnectionParams.setConnectionTimeout(params, 5000); HttpConnectionParams.setSoTimeout(params

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

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

  • 从主机A上的客户端应用程序启动HTTP POST
  • 日志表明客户端已调用底层Apache HTTPClient框架后不久,在主机B上启用防火墙规则以阻止来自主机a的流量
  • 我可以确认(通过数据包捕获)测试实际上是在中途切断请求数据

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


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

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

    大意如下:

    HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(params, 5000); HttpConnectionParams.setSoTimeout(params, 20000); HttpClient httpClient = new DefaultHttpClient(params); HttpParams params=新的BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(参数,5000); HttpConnectionParams.setSoTimeout(参数,20000); HttpClient HttpClient=新的默认HttpClient(参数); 每个http消息还有一组唯一的参数,这些参数将覆盖客户端连接对象的设置。您可能希望检查它们是否自己指定了超时,从而使您设置的超时未被使用(除非明确设置,否则不应发生,但值得检查)


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

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

    通过连接发送数据后,您无法获得连接超时。请出示证据。