[
https://issues.apache.org/jira/browse/AXIS2-4007?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12645336#action_12645336
]
Jason Walton commented on AXIS2-4007:
-------------------------------------
This has obviously changed in the trunk. Here's Stub.cleanup() from 1.4.1:
public void cleanup() throws AxisFault {
_service.getAxisConfiguration().removeService(_service.getName());
}
And here's the same from the trunk
(http://svn.apache.org/repos/asf/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/client/Stub.java):
public void cleanup() throws AxisFault {
// service is removed from the service client it self.
}
Erm... What? This means that calling into stub.cleanup() is now a no-op. It
seems like we're relying on the ServiceClient.finalizer() to clean up the
resources when the private _serviceClient is garbage collected. This is an
extremely poor design, since of course the finalizer may never run.
> Axis2 1.4.1 client stub not freed
> ---------------------------------
>
> Key: AXIS2-4007
> URL: https://issues.apache.org/jira/browse/AXIS2-4007
> Project: Axis 2.0 (Axis2)
> Issue Type: Bug
> Components: client-api
> Affects Versions: 1.4.1
> Environment: Axis2 1.4.1
> jdk1.5.0_12
> Reporter: Nanpeng Chen
>
> For Axis2 1.4.1, if I instantiate a new client stub for every web service
> request, the stub is not freed. This was not happened with Axis2 1.2. For
> example, I modified Version service's getVersion() to do following:
> public sample.axisversion.GetVersionResponse getVersion() throws
> ExceptionException0 {
> TestServiceStub stub = null;
> try {
> stub = new
> TestServiceStub("http://localhost:8080/axis2_141/services/TestService/");
> HelloResponse response = stub.Hello(new
> HelloRequest("myName"));
> } catch (AxisFault e) {
> System.err.println(e.getMessage());
> } catch (RemoteException e) {
> System.err.println(e.getMessage());
> } finally {
> if (stub != null) {
> try {
> stub.cleanup();
> } catch (AxisFault e) {
> System.err.println(e.getMessage());
> }
> }
> }
> GetVersionResponse response = new GetVersionResponse();
> response.set_return("1.4.1");
> return response;
> }
> Each time getVersion() is called, it creates a new instance of
> TestServiceStub, and uses it to send out a HelloRequest. I put this modified
> Version.aar along with the TestService.aar into axis2_141.war and deployed it
> to JBoss. After I sent multiple version requests to the Version service, I
> saw significant memory leak for JBOSS.
> I also tried to keep an instance of the stub into a singleton class, and use
> the same instance every time as following:
> public sample.axisversion.GetVersionResponse getVersion() throws
> ExceptionException0 {
> TestServiceStub stub = null;
> try {
> stub =
> TestServiceStubSingleton.INSTANCE.getStub("http://localhost:8080/axis2_141/services/TestService/");
> HelloResponse response = stub.Hello(new
> HelloRequest("myName"));
> } catch (AxisFault e) {
> System.err.println(e.getMessage());
> } catch (RemoteException e) {
> System.err.println(e.getMessage());
> }
> GetVersionResponse response = new GetVersionResponse();
> response.set_return("1.4.1");
> return response;
> }
> This workaround fixed the memory leak. But in our applications, we have
> situations that new client stub has to be created each time. I think the
> better solution is for Axis2 to free the client stub.
--
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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]