hc-httpclient-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Oleg Kalnichevski <ol...@apache.org>
Subject Re: tcp connections left with CLOSE_WAIT
Date Wed, 14 Nov 2007 22:39:44 GMT
Kadlabalu, Hareesh wrote:
> Hi all,
> 
> This is regarding some tcp connections left with CLOSE_WAIT state when using HttpClient
3.x.
> 
>  
> 
> I have done some googling for discussions around this and looked through the library
code around this area. Just want to validate what seems to be the consensus:
> 
>  
> 
> 1.	When a program makes multiple http requests (hundreds of them), each one using a new
instance of HttpClient, it is possible for some of the sockets to be left with CLOSE_WAIT
state. This happens even when the HttoMethod is properly closed after use each time. 
> 2.	This happens because the HttpMethod's releaseConnection() does not close the underlying
HttpConnection instance as this is available for other requests to reuse.
> 

Correct.


>  Solutions:
> 
> 1.	Use MultiThreadedHttpConnectionManager and shut it down after use. This will close
all connections. I have tested it and it does work.
> 2.	If for whatever reason the first solution cannot be used, another way is to close
the connection explicitly using 
> 
> HttpClient.getHttpConnectionManager().getConnection(hostconfig).close();
> 

Correct, but I would recommend using 
HttpConnectionManager#closeIdleConnections(0) instead, if you want to 
close all idle connections without shutting down the connection manager

http://jakarta.apache.org/httpcomponents/httpclient-3.x/apidocs/org/apache/commons/httpclient/HttpConnectionManager.html#closeIdleConnections(long)


>  
> 
> This works too. But is there a problem doing this? (I know all the reuse of connections
is not possible but is it harmful to use this?)
> 
>  
> 
> Are these conclusions right? 

Yes, they are.

Cheers

Oleg


Attached below is a test program that produces CLOSE_WAIT when host is 
running Weblogic10MP1 on Red Hat AS 4 U5. I have also seen this happen 
on JBoss. This does not happen if I the host is tomcat 6, I am not sure 
if there is a correlation.
> 
>  
> 
> Your advice is very much appreciated
> 
>  
> 
> Thanks
> 
> -hareesh
> 
>  
> 
> ---------------Test code
> 
>  
> 
> public final class TestHttpClient
> 
> {
> 
>     static String url;
> 
>     public static void main( String [] args )
> 
>     {
> 
>         url = args[ 0 ];
> 
>         int counter = args.length > 1 ? Integer.parseInt( args[ 1 ] ) : 100;
> 
>         long waitTime = args.length > 2 ? Long.parseLong( args[ 2 ] ) : 0;
> 
>         int batch = args.length > 3 ? Integer.parseInt( args[ 3 ] ) : 1; 
> 
>  
> 
>         try
> 
>         {
> 
>             for( int x = 0; x < batch; x++ )
> 
>             {
> 
>                 for( int j = 0; j < counter; j++ )
> 
>                 {
> 
>                     _postData( x, j );
> 
>                     if( waitTime > 0 )
> 
>                         Thread.sleep( waitTime );
> 
>                 }
> 
>             }
> 
>             _waitForEver();
> 
>         }
> 
>         catch (Exception e)
> 
>         {
> 
>             e.printStackTrace();
> 
>         }
> 
>     }
> 
>  
> 
>     private static void _postData( int batch, int counter ) throws IOException
> 
>     {
> 
>         HttpClient client = new HttpClient();
> 
>         PostMethod postMethod = new PostMethod( url );
> 
>         StringPart sPart = new StringPart( "ftcmd", "pingdb", "UTF-8" );
> 
>         RequestEntity entity = new MultipartRequestEntity( new Part[] {sPart}, postMethod.getParams()
);
> 
>         postMethod.setRequestEntity( entity );
> 
>  
> 
>         try
> 
>         {
> 
>             client.executeMethod( postMethod );
> 
>         }
> 
>         finally
> 
>         {
> 
>             postMethod.releaseConnection();
> 
>             System.out.println("batch " + batch + " iteration " + counter + " done");
> 
>         }
> 
>     }
> 
>  
> 
>     private static void _waitForEver() throws InterruptedException
> 
>     {
> 
>         while( true )
> 
>         {
> 
>             Thread.sleep( 10000 );
> 
>             System.out.println("Still alive..");
> 
>         }
> 
>     }
> 
>     
> 
> }
> 
>  
> 
>  
> 
>  
> 
>  
> 
>  
> 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: httpclient-user-help@jakarta.apache.org


Mime
View raw message