2011-10-11 36 views
0

我使用的HttpClient 4.1.2。如果我做一个连接到特定的主机XYZ并保持 超过5运行客户端程序,以6小时,连接到同一个主机XYZ开始给:的Apache的HttpClient给连接超时后5个OT 6小时

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.我在SingleClientConnManager中使用了DefaultHttpClient。

回答

1

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

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

  2. 当在客户端和服务器,并且请求之间的防火墙/负载均衡器不被传递到服务器。你可以看看你传递的号码头,并确保这不是太高,并放弃那些不必要的。

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

wire level logging在调试这些问题有用。

+0

谢谢roraol。这非常有帮助。我会尝试这些并回传结果。 – Litty

+0

如果我启用线级调试日志记录,则不会发生此问题。所以根本原因应该是第一个提到的原因。对?所以,我试过如下: 请看下评论: – Litty

+0

'INT的StatusCode = res.getStatusLine()getStatusCode(); String reasonPhrase = res.getStatusLine()。getReasonPhrase(); Header [] headers = res.getAllHeaders(); HashMap headerMap = new HashMap (); 如果(头!= NULL){ \t为(报头报头:报头){ \t \t如果(标题!= NULL){ \t \t \t headerMap.put(header.getName(),header.getValue()) ; \t \t} \t} } HttpEntity resEntity = res.getEntity(); 如果(resEntity = NULL && resEntity.getContentLength()> 0!){ \t ByteArrayOutputStream OS =新ByteArrayOutputStream(); \t resEntity.writeTo(os); \t resStr = os.toString(); }' – Litty

相关问题