[ 
https://issues.apache.org/activemq/browse/SMXCOMP-24?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=51766#action_51766
 ] 

Nathan Ferris commented on SMXCOMP-24:
--------------------------------------

I have run into this issue as well and independently came to the conclusion 
that my BeanEndpoint was leaking Request objects.  I am using version 2009.01 
of servicemix-bean

The Bean that I am using implements MessageExchangeListener, so it wouldn't 
ever get into the enclosing else block from Craig's patch.  The if block above 
it looks like this: 

if (req.getBean() instanceof MessageExchangeListener) {
                ((MessageExchangeListener) 
req.getBean()).onMessageExchange(exchange);
} else ....

In this case, the bean has no access to the requests member variable and thus 
can't remove the request itself.  Suppose that the provider bean sends a reply 
message asynchronously.  Since the exchange will not yet be marked done, it 
will be stored in requests.  Later, when the consumer marks the exchange as 
done, which sends an exchange back to the provider, the exchange will come 
through as a new object.  The new exchange object is marked as done, but the 
original, which is still in the requests map, is still marked as active, which 
prevents it from being removed.

> Items not removed from BeanEndpoint requests Map in all cases of request 
> completion 
> ------------------------------------------------------------------------------------
>
>                 Key: SMXCOMP-24
>                 URL: https://issues.apache.org/activemq/browse/SMXCOMP-24
>             Project: ServiceMix Components
>          Issue Type: Bug
>          Components: servicemix-bean
>    Affects Versions: 3.2.2
>            Reporter: Craig Cobb
>         Attachments: BeanEndpointPatch.txt
>
>
> Memory leak caused by Request objects not being removed from "requests" Map 
> in all cases.  Requests not removed results in memory leak.
> Patch info:
> {code}
> ### Eclipse Workspace Patch 1.0
> #P servicemix-3.2
> Index: 
> deployables/serviceengines/servicemix-bean/src/main/java/org/apache/servicemix/bean/BeanEndpoint.java
> ===================================================================
> --- 
> deployables/serviceengines/servicemix-bean/src/main/java/org/apache/servicemix/bean/BeanEndpoint.java
>      (revision 693290)
> +++ 
> deployables/serviceengines/servicemix-bean/src/main/java/org/apache/servicemix/bean/BeanEndpoint.java
>      (working copy)
> @@ -236,13 +236,16 @@
>              } else {
>                  // Exchange is finished
>                  if (exchange.getStatus() == ExchangeStatus.DONE) {
> +                    requests.remove(corId);
>                      return;
>                  // Exchange has been aborted with an exception
>                  } else if (exchange.getStatus() == ExchangeStatus.ERROR) {
> +                    requests.remove(corId);
>                      return;
>                  // Fault message
>                  } else if (exchange.getFault() != null) {
>                      // TODO: find a way to send it back to the bean before 
> setting the DONE status
> +                    requests.remove(corId);
>                      done(exchange);
>                  } else {
>                      MethodInvocation invocation = 
> getMethodInvocationStrategy().createInvocation(
> {code}

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

Reply via email to