【问题标题】:Apache httpclient giving connection timeout after 5 ot 6 hrsApache httpclient 在 5 到 6 小时后给出连接超时
【发布时间】:2011-10-11 08:55:59
【问题描述】:

我正在使用 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)

如果我连接到不同的主机,它会成功。问题消失一次 我重新启动我的客户端程序。通过浏览器连接同一个主机会成功。

服务器是一个 tomcat 6。客户端和服务器都在 JRE 5 上运行。我设置了连接超时 = 20000 和套接字超时 = 60000。我正在使用 DefaultHttpClient 和 SingleClientConnManager。

【问题讨论】:

    标签: java rest httpclient connection-timeout


    【解决方案1】:

    我在这些案例中看到过类似的连接问题:

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

    2. 当客户端和服务器之间存在防火墙/负载平衡器并且请求未传递到服务器时。您可以查看您传递的数字标题并确保它不会太高并丢弃那些不必要的。

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

    wire level logging 可用于调试此类问题。

    【讨论】:

    • 谢谢罗拉尔。这很有帮助。我会尝试这些并将结果发回。
    • 如果我启用线路级调试日志记录,则不会发生此问题。所以根本原因应该是提到的第一个原因。正确的?所以我尝试了以下方法:请参阅下一条评论:
    • int statusCode = res.getStatusLine().getStatusCode(); String reasonPhrase = res.getStatusLine().getReasonPhrase(); Header[] headers = res.getAllHeaders(); HashMap<String, String> headerMap = new HashMap<String, String>(); if (headers != null) { for (Header header : headers) { if (header != null) { headerMap.put(header.getName(), header.getValue()); } } } HttpEntity resEntity = res.getEntity(); if (resEntity != null && resEntity.getContentLength() > 0) { ByteArrayOutputStream os = new ByteArrayOutputStream(); resEntity.writeTo(os); resStr = os.toString(); }
    • 但它仍然给我同样的问题。那么你能建议我如何完全清空响应吗?
    • 要清空响应,请确保您从实体内容中读取所有内容。为此,从 resEntity.getContent() 创建一个读取器,并在循环内从读取器读取。然后关闭阅读器。
    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多