Java Apache httpclient在5到6小时后给出连接超时

Java Apache httpclient在5到6小时后给出连接超时,java,rest,httpclient,connection-timeout,Java,Rest,Httpclient,Connection Timeout,我正在使用httpclient 4.1.2。如果我连接到特定主机XYZ并保持 运行超过5到6小时的客户端程序连接到同一主机XYZ,开始提供: org.apache.http.conn.ConnectTimeoutException: Connect to XYZ timed out at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:377) at org

我正在使用httpclient 4.1.2。如果我连接到特定主机XYZ并保持 运行超过5到6小时的客户端程序连接到同一主机XYZ,开始提供:

org.apache.http.conn.ConnectTimeoutException: Connect to XYZ timed out
        at
org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:377)
        at
org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
        at
org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
        at
org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
        at
org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573)
        at
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
        at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
        at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
        at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
如果我连接到其他主机,它将成功。问题一次就解决了 我重新启动我的客户端程序。通过浏览器连接到同一主机将成功


服务器是Tomcat6。客户端和服务器都在JRE 5上运行。我已将连接超时设置为20000,套接字超时设置为60000。我正在将DefaultHttpClient与SingleClientConnManager一起使用。

在这些情况下,我看到过类似的连接问题:

  • 当程序员没有在每次请求后完全清空http响应对象时。特别是当您收到意外的响应代码(例如500)时,您仍然必须清空响应对象

  • 当客户端和服务器之间存在防火墙/负载平衡器且请求未传递到服务器时。您可以查看正在传递的头数,并确保其不太高,然后丢弃那些不必要的头数

  • 注:我认为这些超时值非常高。通常,您希望服务器在几秒钟内做出响应,而不是几十秒钟


    在调试此类问题时,可以使用。

    谢谢roraol。这很有帮助。我将尝试这些方法并发回结果。如果我启用线级调试日志记录,则不会发生此问题。所以根本原因应该是第一个提到的原因。对吗?因此,我尝试了以下操作:请参见下一条注释:
    int statusCode=res.getStatusLine().getStatusCode();字符串reasonPhrase=res.getStatusLine().getReasonPhrase();Header[]headers=res.getAllHeaders();HashMap headerMap=新HashMap();if(headers!=null){for(Header-Header:headers){if(Header!=null){headerMap.put(Header.getName(),Header.getValue();}}}}}}}HttpEntity-resEntity=res.getEntity();如果(resEntity!=null&&resEntity.getContentLength()>0){ByteArrayOutputStream os=new ByteArrayOutputStream();resEntity.writeTo(os);resStr=os.toString();}
    但它仍然给了我同样的问题。那么,您能建议我如何完全清空响应吗?要清空响应,请确保您阅读了实体内容中的所有内容。为此,从resEntity.getContent()创建一个读卡器,并从循环中的读卡器中读取。然后关闭阅读器。