Proper timeout handling with Apache HttpClient

August 24th, 2009 by Brian | Filed under work.

I’ve seen some really bad things happen when developers don’t code in proper timeout handling. Occasionally I’ve been asked what the best way to handle timeouts is – so I thought I’d share my take on it:

  1. MultiThreadedHttpConnectionManager connectionManager =  new MultiThreadedHttpConnectionManager();
  2. HttpConnectionManagerParams params = connectionManager.getParams();
  3.  
  4. params.setConnectionTimeout(connectiontimeout); //set connection timeout (how long it takes to connect to remote host)
  5. params.setSoTimeout(sotimeout); //set socket timeout (how long it takes to retrieve data from remote host)
  6.  
  7. HttpMethodBase baseMethod = null;
  8.  
  9. try {
  10.   HttpClient httpClient = new HttpClient(connectionManager);
  11.   httpClient.getParams().setParameter("http.connection-manager.timeout", poolTimeout); //set timeout on how long we’ll wait for a connection from the pool
  12.  
  13.   baseMethod = new GetMethod();
  14.   int statusCode = httpClient.executeMethod();
  15.  
  16.   …
  17. }
  18. catch (ConnectTimeoutException cte ){
  19.   //Took too long to connect to remote host
  20. }
  21. catch (SocketTimeoutException ste){
  22.   //Remote host didn’t respond in time
  23. }
  24. catch (Exception se){
  25.   //Some other error occurred
  26. }
  27. finally {
  28.   if (baseMethod != null)
  29.     baseMethod.releaseConnection();
  30. }

Tags: , , ,

5 Responses to “Proper timeout handling with Apache HttpClient”

  1. subdigit | 24/08/09

    Dug through my old code. Is setting the timeout at the HttpClient level as above:

    httpClient.getParams().setParameter(“http.connection-manager.timeout”, poolTimeout);

    the same thing as setting the timeout at the ConnectionManager level?

    connectionManager.getParams().setConnectionTimeout(poolTimeout);

    Does the manager automatically pass the parameters to the client as it creates the client?

  2. subdigit | 24/08/09

    Oh, and which packages are the ConnectionTimeoutException and SocketTimeoutException from? And what actually throws them? I can only seem to find that an HttpException gets thrown from within the .executeMethod.

  3. Brian | 25/08/09

    Yep, both setting them on the connection manager & on the httpclient should have same effect. I think there are a few more settings you can do within the connection manager and/or it’s good for reuse – building multiple httpclient objects without needing to re-specify all the settings.

  4. Brian | 25/08/09

    org.apache.commons.httpclient.ConnectTimeoutException
    and
    java.net.SocketTimeoutException

    The SocketTimeoutException is thrown by HttpMethodBase on things like getResponseStreamAsBody() which throws an IOException which wraps an InterruptedException which wraps a SocketTimeoutException. Simple right? :)

    More information on exception handling here

  5. subdigit | 26/08/09

    Ah, all those wrappers. Ok. Added them to my code. I was just catching a generic Exception before, but having the specific exception can be useful.

Share Your Thoughts