Author: gnodet
Date: Wed Jun 27 01:34:11 2007
New Revision: 551092

URL: http://svn.apache.org/viewvc?view=rev&rev=551092
Log:
SM-892: memory leak in org.apache.servicemix.bean.BeanEndpoint

Modified:
    
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/main/java/org/apache/servicemix/bean/BeanEndpoint.java
    
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/main/java/org/apache/servicemix/bean/support/Request.java
    
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/test/java/org/apache/servicemix/bean/ListenerBeanEndpointTest.java
    
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/test/java/org/apache/servicemix/bean/SpringComponentTest.java
    
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/test/java/org/apache/servicemix/bean/beans/ListenerBean.java

Modified: 
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/main/java/org/apache/servicemix/bean/BeanEndpoint.java
URL: 
http://svn.apache.org/viewvc/incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/main/java/org/apache/servicemix/bean/BeanEndpoint.java?view=diff&rev=551092&r1=551091&r2=551092
==============================================================================
--- 
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/main/java/org/apache/servicemix/bean/BeanEndpoint.java
 (original)
+++ 
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/main/java/org/apache/servicemix/bean/BeanEndpoint.java
 Wed Jun 27 01:34:11 2007
@@ -55,8 +55,6 @@
 import org.apache.servicemix.jbi.resolver.URIResolver;
 import org.apache.servicemix.jbi.util.MessageUtil;
 import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.beans.factory.BeanFactoryAware;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.context.ApplicationContext;
 
@@ -391,8 +389,8 @@
     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);
+            //request.setBean(null);
+            //request.setExchange(null);
             requests.remove(corId);
         }
     }

Modified: 
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/main/java/org/apache/servicemix/bean/support/Request.java
URL: 
http://svn.apache.org/viewvc/incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/main/java/org/apache/servicemix/bean/support/Request.java?view=diff&rev=551092&r1=551091&r2=551092
==============================================================================
--- 
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/main/java/org/apache/servicemix/bean/support/Request.java
 (original)
+++ 
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/main/java/org/apache/servicemix/bean/support/Request.java
 Wed Jun 27 01:34:11 2007
@@ -28,10 +28,10 @@
 public class Request {
     private Object bean;
     private MessageExchange exchange;
-    private Set<String> sentExchanges = new HashSet<String>();
+    private Set<String> sentExchanges;
     // Keep track of callbacks already called, so that the same callback
     // can not be called twice
-    private Map<Method, Boolean> callbacks = new HashMap<Method, Boolean>();
+    private Map<Method, Boolean> callbacks;
     
     public Request() {
     }
@@ -69,6 +69,9 @@
      * @param id the id of the exchange sent 
      */
     public void addSentExchange(String id) {
+        if (sentExchanges == null) {
+           sentExchanges = new HashSet<String>();
+        }
         sentExchanges.add(id);
     }
 
@@ -76,6 +79,9 @@
      * @return the callbacks
      */
     public Map<Method, Boolean> getCallbacks() {
+        if (callbacks == null) {
+            callbacks = new HashMap<Method, Boolean>();
+        }
         return callbacks;
     }
 

Modified: 
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/test/java/org/apache/servicemix/bean/ListenerBeanEndpointTest.java
URL: 
http://svn.apache.org/viewvc/incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/test/java/org/apache/servicemix/bean/ListenerBeanEndpointTest.java?view=diff&rev=551092&r1=551091&r2=551092
==============================================================================
--- 
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/test/java/org/apache/servicemix/bean/ListenerBeanEndpointTest.java
 (original)
+++ 
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/test/java/org/apache/servicemix/bean/ListenerBeanEndpointTest.java
 Wed Jun 27 01:34:11 2007
@@ -28,6 +28,7 @@
 
 import javax.jbi.messaging.ExchangeStatus;
 import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.InOut;
 import javax.jbi.messaging.MessageExchange;
 import javax.jbi.servicedesc.ServiceEndpoint;
 
@@ -45,6 +46,30 @@
         exchange.setEndpoint(se);
         exchange.getInMessage().setContent(new 
StringSource("<hello>world</hello>"));
         client.sendSync(exchange);
+
+        assertExchangeWorked(exchange);
+
+        ListenerBean bean = (ListenerBean) getBean("listenerBean");
+        MessageExchange answer = bean.getLastExchange();
+
+        log.info("Bean's process() method has been invoked: " + answer);
+
+        assertNotNull("Bean's process() method should bave been invoked", 
answer);
+    }
+
+    public void 
testSendingInOutToDynamicEndpointForExchangeProcessorBeanWithFooOperation() 
throws Exception {
+        // now lets make a request on this endpoint
+        DefaultServiceMixClient client = new DefaultServiceMixClient(jbi);
+
+        DocumentFragment epr = URIResolver.createWSAEPR("bean:listenerBean");
+        ServiceEndpoint se = client.getContext().resolveEndpointReference(epr);
+        assertNotNull("We should find a service endpoint!", se);
+
+        InOut exchange = client.createInOutExchange();
+        exchange.setEndpoint(se);
+        exchange.getInMessage().setContent(new 
StringSource("<hello>world</hello>"));
+        client.sendSync(exchange);
+        client.done(exchange);
 
         assertExchangeWorked(exchange);
 

Modified: 
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/test/java/org/apache/servicemix/bean/SpringComponentTest.java
URL: 
http://svn.apache.org/viewvc/incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/test/java/org/apache/servicemix/bean/SpringComponentTest.java?view=diff&rev=551092&r1=551091&r2=551092
==============================================================================
--- 
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/test/java/org/apache/servicemix/bean/SpringComponentTest.java
 (original)
+++ 
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/test/java/org/apache/servicemix/bean/SpringComponentTest.java
 Wed Jun 27 01:34:11 2007
@@ -25,6 +25,7 @@
 import org.springframework.context.support.AbstractXmlApplicationContext;
 
 import javax.jbi.messaging.InOnly;
+import javax.jbi.messaging.InOut;
 import javax.jbi.messaging.NormalizedMessage;
 import javax.jbi.messaging.MessageExchange;
 import javax.jbi.messaging.ExchangeStatus;
@@ -50,6 +51,25 @@
         log.info("The bean has been invoked: " + bean.getLastExchange());
     }
 
+    public void testSendingInOutToStaticEndpoint() throws Exception {
+        DefaultServiceMixClient client = new DefaultServiceMixClient(jbi);
+
+        InOut me = client.createInOutExchange();
+        me.setService(new QName("urn:test", "service"));
+        NormalizedMessage message = me.getInMessage();
+
+        message.setProperty("name", "cheese");
+        message.setContent(new StringSource("<hello>world</hello>"));
+
+        client.sendSync(me);
+        client.done(me);
+        assertExchangeWorked(me);
+
+        ListenerBean bean = (ListenerBean) getBean("listenerBean");
+        assertNotNull("Bean should bave been invoked", bean.getLastExchange());
+
+        log.info("The bean has been invoked: " + bean.getLastExchange());
+    }
 
     protected void assertExchangeWorked(MessageExchange me) throws Exception {
         if (me.getStatus() == ExchangeStatus.ERROR) {

Modified: 
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/test/java/org/apache/servicemix/bean/beans/ListenerBean.java
URL: 
http://svn.apache.org/viewvc/incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/test/java/org/apache/servicemix/bean/beans/ListenerBean.java?view=diff&rev=551092&r1=551091&r2=551092
==============================================================================
--- 
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/test/java/org/apache/servicemix/bean/beans/ListenerBean.java
 (original)
+++ 
incubator/servicemix/branches/servicemix-3.1/deployables/serviceengines/servicemix-bean/src/test/java/org/apache/servicemix/bean/beans/ListenerBean.java
 Wed Jun 27 01:34:11 2007
@@ -19,10 +19,12 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.servicemix.MessageExchangeListener;
+import org.apache.servicemix.jbi.util.MessageUtil;
 
 import javax.annotation.Resource;
 import javax.jbi.messaging.DeliveryChannel;
 import javax.jbi.messaging.ExchangeStatus;
+import javax.jbi.messaging.InOnly;
 import javax.jbi.messaging.MessageExchange;
 import javax.jbi.messaging.MessagingException;
 
@@ -44,8 +46,13 @@
     public void onMessageExchange(MessageExchange exchange) throws 
MessagingException {
         this.lastExchange = exchange;
         log.info("Received exchange: " + exchange);
-        exchange.setStatus(ExchangeStatus.DONE);
-        channel.send(exchange);
+        if (exchange instanceof InOnly) {
+            exchange.setStatus(ExchangeStatus.DONE);
+            channel.send(exchange);
+        } else if (exchange.getStatus() == ExchangeStatus.ACTIVE) {
+            MessageUtil.transferInToOut(exchange, exchange);
+            channel.send(exchange);
+        }
     }
 
     public MessageExchange getLastExchange() {


Reply via email to