Friday, January 23, 2009

DeploymentException, ArrayIndexOutOfBoundsException, OutOfMemoryError casued by Parlay X with Axis2

Problem:Using Axis2 client to make a webservice call to Parlay X service, might cause the following exceptions, eventually OutOfMemoryError.


2009-01-15 07:32:18,947 ERROR [org.apache.axis2.deployment.ModuleDeployer]
The mex-1.4.jar module, which is not valid, caused null
org.apache.axis2.deployment.DeploymentException
at org.apache.axis2.deployment.repository.util.ArchiveReader.readModuleArchive(ArchiveReader.java:531)
at org.apache.axis2.deployment.ModuleDeployer.deploy(ModuleDeployer.java:71)
at org.apache.axis2.deployment.repository.util.DeploymentFileData.deploy(DeploymentFileData.java:136)
at org.apache.axis2.deployment.DeploymentEngine.doDeploy(DeploymentEngine.java:597)
at org.apache.axis2.deployment.RepositoryListener.loadClassPathModules(RepositoryListener.java:195)
at org.apache.axis2.deployment.RepositoryListener.init2(RepositoryListener.java:70)
at org.apache.axis2.deployment.RepositoryListener.(RepositoryListener.java:63)
at org.apache.axis2.deployment.DeploymentEngine.loadFromClassPath(DeploymentEngine.java:164)
at org.apache.axis2.deployment.FileSystemConfigurator.getAxisConfiguration(FileSystemConfigurator.java:135)
at org.apache.axis2.context.ConfigurationContextFactory.createConfigurationContext(ConfigurationContextFactory.java:68)
at org.apache.axis2.context.ConfigurationContextFactory.createConfigurationContextFromFileSystem(ConfigurationContextFactory.java:184)
at org.apache.axis2.client.ServiceClient.configureServiceClient(ServiceClient.java:150)
at org.apache.axis2.client.ServiceClient.(ServiceClient.java:143)
at org.csapi.www.wsdl.parlayx.terminal_location.v2_0.service.TerminalLocationServiceStub.(TerminalLocationServiceStub.java:139)
at org.csapi.www.wsdl.parlayx.terminal_location.v2_0.service.TerminalLocationServiceStub.(TerminalLocationServiceStub.java:125)
at org.csapi.www.wsdl.parlayx.terminal_location.v2_0.service.TerminalLocationServiceStub.(TerminalLocationServiceStub.java:173)
at org.csapi.www.wsdl.parlayx.terminal_location.v2_0.service.TerminalLocationServiceStub.(TerminalLocationServiceStub.java:165)
.
.
.
Caused by: org.apache.axiom.om.OMException
at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:243)
at org.apache.axiom.om.impl.llom.OMDocumentImpl.getOMDocumentElement(OMDocumentImpl.java:132)
at org.apache.axiom.om.impl.builder.StAXOMBuilder.getDocumentElement(StAXOMBuilder.java:411)
at org.apache.axis2.util.XMLUtils.toOM(XMLUtils.java:602)
at org.apache.axis2.util.XMLUtils.toOM(XMLUtils.java:581)
at org.apache.axis2.deployment.DescriptionBuilder.buildOM(DescriptionBuilder.java:97)
at org.apache.axis2.deployment.ModuleBuilder.populateModule(ModuleBuilder.java:90)
at org.apache.axis2.deployment.repository.util.ArchiveReader.readModuleArchive(ArchiveReader.java:518)
... 26 more



2009-01-05 00:57:01,845 ERROR [org.apache.axis2.deployment.ModuleDeployer]
The mex-1.4.jar module, which is not valid, caused java.lang.ArrayIndexOutOfBoundsException: -1
org.apache.axis2.deployment.DeploymentException: java.lang.ArrayIndexOutOfBoundsException: -1
at org.apache.axis2.deployment.repository.util.ArchiveReader.readModuleArchive(ArchiveReader.java:531)
at org.apache.axis2.deployment.ModuleDeployer.deploy(ModuleDeployer.java:71)
at org.apache.axis2.deployment.repository.util.DeploymentFileData.deploy(DeploymentFileData.java:136)
at org.apache.axis2.deployment.DeploymentEngine.doDeploy(DeploymentEngine.java:597)
at org.apache.axis2.deployment.RepositoryListener.loadClassPathModules(RepositoryListener.java:195)
at org.apache.axis2.deployment.RepositoryListener.init2(RepositoryListener.java:70)
at org.apache.axis2.deployment.RepositoryListener.(RepositoryListener.java:63)
at org.apache.axis2.deployment.DeploymentEngine.loadFromClassPath(DeploymentEngine.java:164)
at org.apache.axis2.deployment.FileSystemConfigurator.getAxisConfiguration(FileSystemConfigurator.java:135)
at org.apache.axis2.context.ConfigurationContextFactory.createConfigurationContext(ConfigurationContextFactory.java:68)
at org.apache.axis2.context.ConfigurationContextFactory.createConfigurationContextFromFileSystem(ConfigurationContextFactory.java:184)
at org.apache.axis2.client.ServiceClient.configureServiceClient(ServiceClient.java:150)
at org.apache.axis2.client.ServiceClient.(ServiceClient.java:143)
at org.csapi.www.wsdl.parlayx.terminal_location.v2_0.service.TerminalLocationServiceStub.(TerminalLocationServiceStub.java:139)
at org.csapi.www.wsdl.parlayx.terminal_location.v2_0.service.TerminalLocationServiceStub.(TerminalLocationServiceStub.java:125)
at org.csapi.www.wsdl.parlayx.terminal_location.v2_0.service.TerminalLocationServiceStub.(TerminalLocationServiceStub.java:173)
at org.csapi.www.wsdl.parlayx.terminal_location.v2_0.service.TerminalLocationServiceStub.(TerminalLocationServiceStub.java:165)
.
.
.
Caused by: org.apache.axiom.om.OMException: java.lang.ArrayIndexOutOfBoundsException: -1
at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:249)
at org.apache.axiom.om.impl.llom.OMDocumentImpl.getOMDocumentElement(OMDocumentImpl.java:132)
at org.apache.axiom.om.impl.builder.StAXOMBuilder.getDocumentElement(StAXOMBuilder.java:411)
at org.apache.axis2.util.XMLUtils.toOM(XMLUtils.java:602)
at org.apache.axis2.util.XMLUtils.toOM(XMLUtils.java:581)
at org.apache.axis2.deployment.DescriptionBuilder.buildOM(DescriptionBuilder.java:97)
at org.apache.axis2.deployment.ModuleBuilder.populateModule(ModuleBuilder.java:90)
at org.apache.axis2.deployment.repository.util.ArchiveReader.readModuleArchive(ArchiveReader.java:518)
... 26 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
at com.sun.xml.stream.xerces.util.NamespaceSupport.pushContext(NamespaceSupport.java:178)
at com.sun.xml.stream.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:240)
at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2599)
at com.sun.xml.stream.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:857)
at com.sun.xml.stream.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:330)
at com.sun.xml.stream.XMLReaderImpl.next(XMLReaderImpl.java:502)
at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:506)
at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:161)
... 33 more

Solution:

Do not instantiate the object of the class that extends org.apache.axis2.client.Stub more than once per application, else it will keep loading the class mex-1.4.jar.

If it needs to be instantiated more than once, then make sure the instantiation method is synchronized. Beware that whenever the mex-1.4.jar is loaded, it will make a copy at the /tmp/ folder, make sure there is enough space to hold all those temp mex-1.4.jar

p.s. possibly related to this

http://issues.apache.org/jira/browse/AXIS2-1927

Friday, January 16, 2009

Axis2 connection retry setting

problem: Axis2 retries 3 times before giving up connection, and want to disable this retry feature.


- I/O exception (java.net.ConnectException) caught when processing request: Connection refused
- Retrying request
- I/O exception (java.net.ConnectException) caught when processing request: Connection refused
- Retrying request
- I/O exception (java.net.ConnectException) caught when processing request: Connection refused
- Retrying request
- Unable to sendViaPost to url[http://somehost.com:80/someservice]
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:519)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:140)
at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:125)
at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:346)
at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:542)
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:189)
at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:75)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:364)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:208)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:448)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:401)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:228)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
.
.
.
at java.lang.Thread.run(Thread.java:619)
Connection refused



solution: Customize a HttpClient that disable the retry for the Axis2 stub.


MultiThreadedHttpConnectionManager manager = new MultiThreadedHttpConnectionManager();
HttpMethodRetryHandler retry_handler = new DefaultHttpMethodRetryHandler(0, false);
HttpClientParams params = new HttpClientParams();
params.setParameter(HttpMethodParams.RETRY_HANDLER, retry_handler);
options.setProperty(HTTPConstants.CACHED_HTTP_CLIENT, new HttpClient(params, manager));
options.setProperty(HTTPConstants.REUSE_HTTP_CLIENT, true);