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() {