diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/AbstractMessageHandlerFactoryBean.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/AbstractMessageHandlerFactoryBean.java index 59b635f0b8..9464692d9c 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/AbstractMessageHandlerFactoryBean.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/AbstractMessageHandlerFactoryBean.java @@ -21,6 +21,7 @@ import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.FactoryBean; import org.springframework.integration.core.MessageChannel; +import org.springframework.integration.handler.AbstractMessageHandler; import org.springframework.integration.handler.AbstractReplyProducingMessageHandler; import org.springframework.integration.message.MessageHandler; import org.springframework.util.Assert; @@ -74,15 +75,14 @@ public abstract class AbstractMessageHandlerFactoryBean implements FactoryBean, if (this.handler == null) { this.initializeHandler(); Assert.notNull(this.handler, "failed to create MessageHandler"); - if (this.handler instanceof AbstractReplyProducingMessageHandler) { - AbstractReplyProducingMessageHandler abstractHandler = (AbstractReplyProducingMessageHandler) this.handler; - if (this.outputChannel != null) { - abstractHandler.setOutputChannel(this.outputChannel); - } - if (this.order != null) { - abstractHandler.setOrder(this.order.intValue()); - } - abstractHandler.setBeanFactory(beanFactory); + if (this.handler instanceof AbstractReplyProducingMessageHandler && this.outputChannel != null) { + ((AbstractReplyProducingMessageHandler) this.handler).setOutputChannel(this.outputChannel); + } + if (this.handler instanceof BeanFactoryAware) { + ((BeanFactoryAware) this.handler).setBeanFactory(beanFactory); + } + if (this.handler instanceof AbstractMessageHandler && this.order != null) { + ((AbstractMessageHandler) this.handler).setOrder(this.order.intValue()); } } return this.handler; diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/handler/MessageHandlerChain.java b/org.springframework.integration/src/main/java/org/springframework/integration/handler/MessageHandlerChain.java index 81ed6116d4..c108886c3c 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/handler/MessageHandlerChain.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/handler/MessageHandlerChain.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import java.util.List; import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.PropertyAccessor; +import org.springframework.core.Ordered; import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.context.IntegrationObjectSupport; import org.springframework.integration.core.Message; @@ -62,7 +63,7 @@ import org.springframework.util.Assert; * @author Mark Fisher * @author Iwein Fuld */ -public class MessageHandlerChain extends IntegrationObjectSupport implements MessageHandler { +public class MessageHandlerChain extends IntegrationObjectSupport implements MessageHandler, Ordered { private static final String OUTPUT_CHANNEL_PROPERTY = "outputChannel"; @@ -70,6 +71,8 @@ public class MessageHandlerChain extends IntegrationObjectSupport implements Mes private volatile MessageChannel outputChannel; + private volatile int order = Ordered.LOWEST_PRECEDENCE; + private volatile boolean initialized; private final Object initializationMonitor = new Object(); @@ -83,6 +86,14 @@ public class MessageHandlerChain extends IntegrationObjectSupport implements Mes this.outputChannel = outputChannel; } + public void setOrder(int order) { + this.order = order; + } + + public int getOrder() { + return this.order; + } + public final void afterPropertiesSet() { synchronized (this.initializationMonitor) { if (!this.initialized) { diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/OrderedHandlersTests-context.xml b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/OrderedHandlersTests-context.xml new file mode 100644 index 0000000000..99ff6778ae --- /dev/null +++ b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/OrderedHandlersTests-context.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/OrderedHandlersTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/OrderedHandlersTests.java new file mode 100644 index 0000000000..3bc5880f3c --- /dev/null +++ b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/OrderedHandlersTests.java @@ -0,0 +1,66 @@ +/* + * Copyright 2002-2009 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.config.xml; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.DirectFieldAccessor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.core.Ordered; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Mark Fisher + * @since 1.0.3 + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +public class OrderedHandlersTests { + + @Autowired + private ApplicationContext context; + + + @Test + public void verifyOrder() { + for (int i = 1; i < 14; i++) { + Object consumer = context.getBean("endpoint" + i); + Object handler = new DirectFieldAccessor(consumer).getPropertyValue("handler"); + assertTrue(handler instanceof Ordered); + assertEquals(i, ((Ordered) handler).getOrder()); + } + } + + + static class TestBean { + + public Object handle(Object o) { + return o; + } + + public boolean filter() { + return true; + } + } + +} diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/dispatcher/OrderedAwareLinkedHashSetTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/dispatcher/OrderedAwareLinkedHashSetTests.java index 5a6e647a0c..531c461aab 100644 --- a/org.springframework.integration/src/test/java/org/springframework/integration/dispatcher/OrderedAwareLinkedHashSetTests.java +++ b/org.springframework.integration/src/test/java/org/springframework/integration/dispatcher/OrderedAwareLinkedHashSetTests.java @@ -78,7 +78,6 @@ public class OrderedAwareLinkedHashSetTests { setToTest.add(o9); setToTest.add(o10); assertEquals(10, setToTest.size()); - System.out.println(setToTest); Object[] elements = setToTest.toArray(); assertEquals(o7, elements[0]); assertEquals(o8, elements[1]); @@ -118,7 +117,6 @@ public class OrderedAwareLinkedHashSetTests { assertEquals(10, tempList.size()); OrderedAwareLinkedHashSet orderAwareSet = new OrderedAwareLinkedHashSet(); orderAwareSet.addAll(tempList); - System.out.println(orderAwareSet); Object[] elements = orderAwareSet.toArray(); assertEquals(o7, elements[0]); assertEquals(o8, elements[1]);