hc-httpclient-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Kadlabalu, Hareesh" <Hareesh.Kadlab...@fatwire.com>
Subject tcp connections left with CLOSE_WAIT
Date Wed, 14 Nov 2007 21:37:31 GMT
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.

 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();

 

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? 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..");

        }

    }

    

}

 

 

 

 

 


Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message