Title: [1058] trunk/servicemix-core/src/main/java/org/servicemix/jbi/nmr/SubscriptionManager.java: First fix to SM-229.
Revision
1058
Author
gastaldi
Date
2005-12-12 08:06:35 -0500 (Mon, 12 Dec 2005)

Log Message

First fix to SM-229. 
No StackOverflow, but messages are still delivered twice

Modified Paths

Diff

Modified: trunk/servicemix-core/src/main/java/org/servicemix/jbi/nmr/SubscriptionManager.java (1057 => 1058)

--- trunk/servicemix-core/src/main/java/org/servicemix/jbi/nmr/SubscriptionManager.java	2005-12-09 17:51:07 UTC (rev 1057)
+++ trunk/servicemix-core/src/main/java/org/servicemix/jbi/nmr/SubscriptionManager.java	2005-12-12 13:06:35 UTC (rev 1058)
@@ -17,6 +17,8 @@
  **/
 package org.servicemix.jbi.nmr;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.servicemix.JbiConstants;
 import org.servicemix.MessageExchangeListener;
 import org.servicemix.components.util.ComponentSupport;
@@ -48,7 +50,11 @@
     private Registry registry;
     private String flowName;
     private Flow flow;
-
+    private static Log log = LogFactory.getLog(SubscriptionManager.class);
+    
+    //  SM-229: Avoid StackOverflowException
+    private static final String FROM_SUBSCRIPTION_MANAGER = "org.servicemix.jbi.nmr.from_subman";
+    
     /**
      * Initialize the SubscriptionManager
      * @param broker
@@ -70,14 +76,19 @@
      * @throws JBIException 
      */
     protected boolean dispatchToSubscribers(MessageExchangeImpl exchange) throws JBIException {
-        List list = registry.getMatchingSubscriptionEndpoints(exchange);
-        if (list != null) {
-            for (int i =0;i< list.size(); i++) {
-                InternalEndpoint endpoint = (InternalEndpoint)list.get(i);
-                dispatchToSubscriber(exchange, endpoint);
-            }
-        }
-        return list != null && !list.isEmpty();
+    	Boolean source = (Boolean) exchange.getProperty(FROM_SUBSCRIPTION_MANAGER);
+    	if (source == null || !source.booleanValue()) {
+	        List list = registry.getMatchingSubscriptionEndpoints(exchange);
+	        if (list != null) {
+	            for (int i =0;i< list.size(); i++) {
+	                InternalEndpoint endpoint = (InternalEndpoint)list.get(i);
+	                dispatchToSubscriber(exchange, endpoint);
+	            }
+	        }
+	        return list != null && !list.isEmpty();
+    	} else {
+    		return false;
+    	}
     }
 
     /**
@@ -87,22 +98,30 @@
      * @throws JBIException 
      */
     protected void dispatchToSubscriber(MessageExchangeImpl exchange, InternalEndpoint endpoint) throws JBIException {
-        DeliveryChannel channel = getDeliveryChannel();
-        InOnly me = channel.createExchangeFactory().createInOnlyExchange();
-        NormalizedMessage in = me.createMessage();
-        getMessageTransformer().transform(me, exchange.getInMessage(), in);
-        me.setInMessage(in);
-        me.setEndpoint(endpoint);
-        Set names = exchange.getPropertyNames();
-        for (Iterator iter = names.iterator(); iter.hasNext();) {
-            String name = (String) iter.next();
-            me.setProperty(name, exchange.getProperty(name));
-        }
-        if (Boolean.TRUE.equals(exchange.getProperty(JbiConstants.SEND_SYNC))) {
-            channel.sendSync(me);
-        } else {
-            channel.send(me);
-        }
+    	if (log.isDebugEnabled() && endpoint != null)
+    		log.debug("Subscription Endpoint: "+endpoint.getEndpointName());
+    	// SM-229: Avoid StackOverflowException
+    	Boolean source = (Boolean) exchange.getProperty(FROM_SUBSCRIPTION_MANAGER);
+    	if (source == null || !source.booleanValue()) {
+	        DeliveryChannel channel = getDeliveryChannel();
+	        InOnly me = channel.createExchangeFactory().createInOnlyExchange();
+	        // SM-229: Avoid StackOverflowException 
+	        me.setProperty(FROM_SUBSCRIPTION_MANAGER,Boolean.TRUE);
+	        NormalizedMessage in = me.createMessage();
+	        getMessageTransformer().transform(me, exchange.getInMessage(), in);
+	        me.setInMessage(in);
+	        me.setEndpoint(endpoint);
+	        Set names = exchange.getPropertyNames();
+	        for (Iterator iter = names.iterator(); iter.hasNext();) {
+	            String name = (String) iter.next();
+	            me.setProperty(name, exchange.getProperty(name));
+	        }
+	        if (Boolean.TRUE.equals(exchange.getProperty(JbiConstants.SEND_SYNC))) {
+	            channel.sendSync(me);
+	        } else {
+	            channel.send(me);
+	        }
+    	}
     }
 
 	public Flow getFlow() {

Reply via email to