PreDestroy being called for each exchange when it's not configured that way.
----------------------------------------------------------------------------

                 Key: SM-1136
                 URL: https://issues.apache.org/activemq/browse/SM-1136
             Project: ServiceMix
          Issue Type: Bug
          Components: servicemix-bean
    Affects Versions: 3.2
            Reporter: Ryan Bohn
            Priority: Critical


I have a sender bean and a receiver bean, both configured using <bean:endpoint 
... bean="#...".  The problem is that the PreDestroy method is being called 
after every MessageExchange is finished.

According to the documentation:

Attention: The Bean Endpoint schema allows to set a Bean or a Bean Name. The 
Bean will create a single instance of the POJO per endpoint whereas the Bean 
Name will create an instance per request (message exchange).

I have in my xbean.xml:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:bean="http://servicemix.apache.org/bean/1.0";
       xmlns:example="http://servicemix.apache.org/example";>

  <bean:endpoint service="example:sender" endpoint="senderEndpoint" 
bean="#sender"/>
  <bean:endpoint service="example:receiver" endpoint="receiverEndpoint" 
bean="#receiver"/>

  <bean id="sender" class="example.Sender">
    <property name="target" value="example:receiver"/>
  </bean>
  
  <bean id="receiver" class="example.Receiver">
  </bean>

</beans>

The receiver simply implements MessageExchangeListener.

The PostConstruct and PreDestroy only gets called once on the sender
The PostConstruct only gets called once on the receiver
However, the PreDestroy gets called on the receiver for each request.

I noticed in BeanEndpoint, there is the following method:

protected void checkEndOfRequest(Request request, Object corId) {
        if (request.getExchange().getStatus() != ExchangeStatus.ACTIVE) {
            ReflectionUtils.callLifecycleMethod(request.getBean(), 
PreDestroy.class);
            //request.setBean(null);
            //request.setExchange(null);
            requests.remove(corId);
        }
    }

It doesn't look like this class pays any attention to whether the bean is 
supposed to be a single instance of an instance-per-request, which is probably 
the cause of the problem.


If you need me to attach an example, please let me know.


-- 
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