Details
-
Bug
-
Status: Resolved
-
Critical
-
Resolution: Fixed
-
1.5.1
-
None
-
Operating system Windows and Linux
Application Server: Tomcat 6.0.29
Axis2 version 1.5.1
Client created with ADB
Description
Shutting down Tomcat 6.0.29 gives the following error:
Nov 23, 2010 4:42:18 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: A web application appears to have started a thread named [MultiThreadedHttpConnectionManager cleanup] but has failed to stop it. This is very likely to create a memory leak.
This error only happens when one of our Axis2 web services is called through a generated ADB client stub. It appears to never close this thread.
Our current configuration on the web application:
/**
- The configureServiceStub method sets the web service client settings and
- for the web service call.
- @param params WebServiceParameters
- @throws Exception
*/
private void configureServiceStub(WebServiceParameters params) throws Exception
{
// check if connection manager already established
if(connectionManager == null) { connectionManager = new MultiThreadedHttpConnectionManager(); connectionManagerParams = new HttpConnectionManagerParams(); connectionManagerParams.setDefaultMaxConnectionsPerHost(2); connectionManagerParams.setTcpNoDelay(true); connectionManagerParams.setStaleCheckingEnabled(true); connectionManagerParams.setLinger(0); connectionManager.setParams(connectionManagerParams); httpClient = new HttpClient(connectionManager); configcontext = ConfigurationContextFactory.createDefaultConfigurationContext(); configcontext.setThreadPool(new ThreadPool(1, 3)); configcontext.setProperty(HTTPConstants.REUSE_HTTP_CLIENT, Boolean.TRUE); configcontext.setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient); configcontext.setProperty(HTTPConstants.AUTO_RELEASE_CONNECTION, httpClient); }
if(employeeStub == null)
{ employeeStub = new EmployeeServiceSMARTStub(configcontext, params.getLocalServiceUrl() + "EmployeeServiceSMART.EmployeeServiceSMARTHttpSoap12Endpoint/"); employeeStub._getServiceClient().getOptions().setTimeOutInMilliSeconds(2 * 60 * 1000); employeeStub._getServiceClient().getOptions().setProperty(HTTPConstants.SO_TIMEOUT, 30000); employeeStub._getServiceClient().getOptions().setProperty(HTTPConstants.CONNECTION_TIMEOUT, 30000); employeeStub._getServiceClient().getOptions().setProperty(HTTPConstants.REUSE_HTTP_CLIENT, Boolean.TRUE); employeeStub._getServiceClient().getOptions().setProperty(HTTPConstants.AUTO_RELEASE_CONNECTION, Boolean.TRUE); employeeStub._getServiceClient().getOptions().setProperty(HTTPConstants.CHUNKED, Boolean.TRUE); employeeStub._getServiceClient().getOptions().setCallTransportCleanup(true); employeeStub._getServiceClient().getOptions().setProperty(HTTPConstants.HTTP_PROTOCOL_VERSION, HTTPConstants.HEADER_PROTOCOL_10); }}
After each call we call the following code:
finally
{
// clean up all hanging threads and stop connection manager
if(employeeStub._getServiceClient() != null)
{
try
catch(Exception e)
{ e.printStackTrace(); }try
{ employeeStub._getServiceClient().cleanup(); employeeStub.cleanup(); }
catch(Exception e)
{ e.printStackTrace(); }
}
connectionManager.closeIdleConnections(0);
connectionManager.shutdown();
connectionManager = null;
employeeStub = null;
}