axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Michele Mazzucco (JIRA)" <>
Subject [jira] Commented: (AXIS2-2593) Web Service request loop causes many TIME_WAIT Connections & "BindException: Address already in use: connect"
Date Mon, 30 Apr 2007 16:45:15 GMT


Michele Mazzucco commented on AXIS2-2593:

According to [1] HttpClient uses persistent connections (i.e. multiple http requests use the
same socket) by default, then it should not be possible to have > 1000 open connections
(the tuning parameters on windows are just a workaround, as David correctly pointed out).

[2] explains that there's a 1:1 ratio between HttpConnection(s) and open sockets, so I guess
the problem is that when a ServiceClient is reused every few send operations a new connection
is created. A quick look to the code does not reveal any problem: the CommonsHTTPTransportSender
class simply creates a new HttpSender in writeMessageWithCommons(), but then the client is
correctly reused, if available (see AbstractHTTPSender.getHttpClient()).
Instead previous posts like [3] seems to indicate that even the HttpClient is reused, every
few requests a new connection is opened.


> Web Service request loop causes many TIME_WAIT Connections & "BindException: Address
already in use: connect"
> -------------------------------------------------------------------------------------------------------------
>                 Key: AXIS2-2593
>                 URL:
>             Project: Axis 2.0 (Axis2)
>          Issue Type: Bug
>    Affects Versions: 1.1.1, nightly
>         Environment: Windows XP, Tomcat, Axis2 nightly build (also encountered in 1.1.1),
JiBX 1.1.3, Microsoft Windows XP [Version 5.1.2600], 126 GB free disk space, 1GB RAM.
>            Reporter: David Bueche
>            Priority: Critical
> I am performing the following:
> - Executing a tight loop calling a singel web service
> - Using the same Stub over and over
> - Creating the Stub with a custom ConfigurationContext (see below)
> - Sending cleanup() to Stub after each message sent (although problem existed even before
cleanup() was added)
> After approximately 4000 messages have been sent, an AxisFault is generated caused by
the following exception (see below for full stack trace):
> Address already in use: connect
> It appears that connections from the client to Axis on Tomcat sometimes (but not always)
remain in the TIME_WAIT state for several minutes.  There are 1200-1500 TIME_WAIT connections
open when the AxisFault is generated.
> If I step through the web service messages in a debugger, the problem does not appear
to occur, as the system eventually releases the connections after a minute or two.
> Also, if I insert a System.gc() in the client code each time it sends a message to the
web service (the commented out line of code below), the AxisFault does not occur.  I have
executed the loop over 60,000 times with the garbage collection included without generating
an AxisFault.  There were only 400-700 connections in the TIME_WAIT state at a given time,
but performance slowed down to a crawl.
> Here is the code I am using to create the Stub:
> 	HttpConnectionManagerParams connectionManagerParams = new HttpConnectionManagerParams();
> 	connectionManagerParams.setTcpNoDelay(true);
> 	connectionManagerParams.setStaleCheckingEnabled(true);
> 	MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
> 	connectionManager.setParams(connectionManagerParams);
> 	HttpClient httpClient = new HttpClient(connectionManager);
> 	ConfigurationContext configurationContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(null,
> 	configurationContext.setProperty(HTTPConstants.REUSE_HTTP_CLIENT, Boolean.TRUE);
> 	configurationContext.setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient);
> 	stub = new MyServiceStub(configurationContext, target);
> 	boolean success = true;
> 	while(success) {
> 		success = stub.performService(records);
> 		stub.cleanup();
> 		//  System.gc();
> 	}
> Here is the complete stack trace:
> 	Exception in thread "main" org.apache.axis2.AxisFault: Address already in use: connect
> 		at org.apache.axis2.AxisFault.makeFault(
> 		at org.apache.axis2.transport.http.HTTPSender.sendViaPost(
> 		at org.apache.axis2.transport.http.HTTPSender.send(
> 		at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(
> 		at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(
> 		at org.apache.axis2.engine.AxisEngine.send(
> 		at org.apache.axis2.description.OutInAxisOperationClient.send(
> 		at org.apache.axis2.description.OutInAxisOperationClient.execute(
> 		at
> 		at
> 	Caused by: Address already in use: connect
> 		at Method)
> 		at
> 		at
> 		at
> 		at
> 		at
> 		at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
> 		at sun.reflect.DelegatingMethodAccessorImpl.invoke(
> 		at java.lang.reflect.Method.invoke(
> 		at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(
> 		at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(
> 		at
> 		at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(
> 		at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(
> 		at org.apache.commons.httpclient.HttpClient.executeMethod(
> 		at org.apache.commons.httpclient.HttpClient.executeMethod(
> 		at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(
> 		at org.apache.axis2.transport.http.HTTPSender.sendViaPost(
> 		... 8 more

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message