Both set socket timeout and set connection timeout work for us. You may want to 
use the second method below:

public void setConnectionManagerTimeout(long timeout)
Sets the timeout in milliseconds used when retrieving an HTTP connection from 
the HTTP connection manager.

public void setConnectionTimeout(int timeout)
Sets the timeout until a connection is etablished. A value of zero means the 
timeout is not used. The default value is zero.
i.e.,
client.getHttpConnectionManager().
      getParams().setConnectionTimeout(x);

-Fang

-----Original Message-----
From: KARR, DAVID (ATTSI) [mailto:[email protected]] 
Sent: Wednesday, July 06, 2011 1:22 PM
To: HttpClient User Discussion
Subject: Old HttpClient (3.0.1) seems to ignore connection timeout, does 4.1.1 
do it better?

I'm in the planning stages of converting some code that uses HttpClient 3.0.1 
to upgrade to 4.1.1 (or whatever is the latest when I get to that point).  
There is one symptom that we're seeing with 3.0.1 that I'm wondering will be 
fixed in 4.1.1.

We've always set both a socket timeout and a connection timeout, but I could 
never figure out a valid way to test the latter, so I wasn't sure if it was 
actually doing anything.  I've since gotten more information that may lead to a 
valid test case.

One symptom that we see on some of our test servers sometimes is that a 
connection is attempted to a host that is blocked by the firewall, and instead 
of failing the connection immediately, the connection hangs for a long time and 
gets reported as a "stuck thread" in WebLogic after 600 seconds.

We see the following stack trace (excerpt):

        java.net.PlainSocketImpl.socketConnect(Native Method)
        java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
        java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
        java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
        java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        java.net.Socket.connect(Socket.java:529)
        
com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:550)
        
com.sun.net.ssl.internal.ssl.SSLSocketImpl.<init>(SSLSocketImpl.java:394)
        
com.sun.net.ssl.internal.ssl.SSLSocketFactoryImpl.createSocket(SSLSocketFactoryImpl.java:123)
        
org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory.createSocket(SSLProtocolSocketFactory.java:81)
        
org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory.createSocket(SSLProtocolSocketFactory.java:126)
        
org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:706)

Our connection timeout is set to 90 seconds (probably hugely more than it needs 
to be).  Being that it's sitting in "socketConnect()", it looks to me like it's 
still trying to connect, but it's obviously not timing out after 90 seconds.

We set the read and connection timeouts like this:
------------------
        HttpClientParams    clientParams    = new HttpClientParams();
        clientParams.setSoTimeout(readTimeout);
        clientParams.setConnectionManagerTimeout(connectionTimeout);
        
        HttpClient  httpClient  = new HttpClient(clientParams);
------------------

We're doing this very differently in the code that's using the 4.1.1 
implementation.  Both values are in milliseconds.

The question is: Is this bad behavior one of the known problems with HttpClient 
3.0.1?  Should I expect it to better respect the connection timeout with 4.1.1?

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to