diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/MessageBusParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/MessageBusParser.java
index 0749677a6e..fcd098b02e 100644
--- a/spring-integration-core/src/main/java/org/springframework/integration/config/MessageBusParser.java
+++ b/spring-integration-core/src/main/java/org/springframework/integration/config/MessageBusParser.java
@@ -16,30 +16,36 @@
package org.springframework.integration.config;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
import org.springframework.beans.factory.BeanDefinitionStoreException;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.core.Conventions;
import org.springframework.integration.ConfigurationException;
import org.springframework.integration.bus.MessageBus;
+import org.springframework.integration.bus.MessageBusAwareBeanPostProcessor;
import org.springframework.integration.endpoint.ConcurrencyPolicy;
import org.springframework.util.StringUtils;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
/**
* Parser for the message-bus element of the integration namespace.
*
* @author Mark Fisher
+ * @author Marius Bogoevici
*/
public class MessageBusParser extends AbstractSimpleBeanDefinitionParser {
public static final String MESSAGE_BUS_BEAN_NAME = "internal.MessageBus";
+ public static final String MESSAGE_BUS_AWARE_POST_PROCESSOR_BEAN_NAME = "internal.MessageBusAwareBeanPostProcessor";
+
private static final Class> MESSAGE_BUS_CLASS = MessageBus.class;
private static final String ERROR_CHANNEL_ATTRIBUTE = "error-channel";
@@ -48,7 +54,6 @@ public class MessageBusParser extends AbstractSimpleBeanDefinitionParser {
private static final String DEFAULT_CONCURRENCY_PROPERTY = "defaultConcurrencyPolicy";
-
@Override
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext)
throws BeanDefinitionStoreException {
@@ -93,4 +98,21 @@ public class MessageBusParser extends AbstractSimpleBeanDefinitionParser {
}
}
+ @Override
+ protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
+ super.doParse(element, parserContext, builder);
+ addPostProcessors(parserContext);
+ }
+
+ /**
+ * Adds extra post-processors to the context, to inject the objects configured by the MessageBus
+ */
+ private void addPostProcessors(ParserContext parserContext) {
+ BeanDefinition postProcessorDefinition = new RootBeanDefinition(MessageBusAwareBeanPostProcessor.class);
+ postProcessorDefinition.getConstructorArgumentValues().addGenericArgumentValue(
+ new RuntimeBeanReference(MessageBusParser.MESSAGE_BUS_BEAN_NAME));
+ parserContext.getRegistry().registerBeanDefinition(MESSAGE_BUS_AWARE_POST_PROCESSOR_BEAN_NAME,
+ postProcessorDefinition);
+ }
+
}
diff --git a/spring-integration-core/src/test/java/org/springframework/integration/config/MessageBusParserTests.java b/spring-integration-core/src/test/java/org/springframework/integration/config/MessageBusParserTests.java
index 47eb2495f0..f510f46e1c 100644
--- a/spring-integration-core/src/test/java/org/springframework/integration/config/MessageBusParserTests.java
+++ b/spring-integration-core/src/test/java/org/springframework/integration/config/MessageBusParserTests.java
@@ -28,12 +28,14 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.ConfigurationException;
import org.springframework.integration.bus.MessageBus;
+import org.springframework.integration.bus.TestMessageBusAwareImpl;
import org.springframework.integration.endpoint.TargetEndpoint;
import org.springframework.integration.handler.TestHandlers;
import org.springframework.integration.scheduling.Subscription;
/**
* @author Mark Fisher
+ * @author Marius Bogoevici
*/
public class MessageBusParserTests {
@@ -97,7 +99,12 @@ public class MessageBusParserTests {
}
catch (BeanCreationException e) {
exceptionThrown = true;
- assertEquals(ConfigurationException.class, e.getCause().getClass());
+ // an exception is thrown when creating the post-processor, which
+ // tries to get a reference to the message bus
+ assertEquals(BeanCreationException.class, e.getCause().getClass());
+ assertEquals(e.getBeanName(), MessageBusParser.MESSAGE_BUS_AWARE_POST_PROCESSOR_BEAN_NAME);
+ assertEquals(ConfigurationException.class, ((BeanCreationException) e.getCause()).getCause().getClass());
+ assertEquals(((BeanCreationException) e.getCause()).getBeanName(), MessageBusParser.MESSAGE_BUS_BEAN_NAME);
}
assertTrue(exceptionThrown);
}
@@ -128,5 +135,13 @@ public class MessageBusParserTests {
assertEquals(14, endpoint2.getConcurrencyPolicy().getCoreSize());
assertEquals(17, endpoint2.getConcurrencyPolicy().getMaxSize());
}
+
+ @Test
+ public void testMessageBusAwareAutomaticallyAddedByNamespace() {
+ ApplicationContext context = new ClassPathXmlApplicationContext("messageBusWithMessageBusAware.xml",
+ this.getClass());
+ TestMessageBusAwareImpl messageBusAware = (TestMessageBusAwareImpl) context.getBean("messageBusAwareBean");
+ assertTrue(messageBusAware.getMessageBus() == context.getBean(MessageBusParser.MESSAGE_BUS_BEAN_NAME));
+ }
}
diff --git a/spring-integration-core/src/test/java/org/springframework/integration/config/messageBusWithMessageBusAware.xml b/spring-integration-core/src/test/java/org/springframework/integration/config/messageBusWithMessageBusAware.xml
new file mode 100644
index 0000000000..9bbd01c608
--- /dev/null
+++ b/spring-integration-core/src/test/java/org/springframework/integration/config/messageBusWithMessageBusAware.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+