diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsMessageDrivenEndpointParser.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsMessageDrivenEndpointParser.java index bff5987386..69db5b686e 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsMessageDrivenEndpointParser.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsMessageDrivenEndpointParser.java @@ -27,6 +27,7 @@ import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.integration.config.xml.IntegrationNamespaceUtils; +import org.springframework.integration.jms.ChannelPublishingJmsMessageListener; import org.springframework.integration.jms.JmsMessageDrivenEndpoint; import org.springframework.jms.listener.DefaultMessageListenerContainer; import org.springframework.util.StringUtils; @@ -111,8 +112,8 @@ public class JmsMessageDrivenEndpointParser extends AbstractSingleBeanDefinition @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - String containerBeanName = this.parseMessageListenerContainer(element, parserContext); - String listenerBeanName = this.parseMessageListener(element, parserContext); + String containerBeanName = this.parseMessageListenerContainer(element, parserContext, builder.getRawBeanDefinition()); + String listenerBeanName = this.parseMessageListener(element, parserContext, builder.getRawBeanDefinition()); builder.addConstructorArgReference(containerBeanName); builder.addConstructorArgReference(listenerBeanName); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, IntegrationNamespaceUtils.AUTO_STARTUP); @@ -121,7 +122,8 @@ public class JmsMessageDrivenEndpointParser extends AbstractSingleBeanDefinition } - private String parseMessageListenerContainer(Element element, ParserContext parserContext) { + private String parseMessageListenerContainer(Element element, ParserContext parserContext, + BeanDefinition adapterBeanDefinition) { String containerClass = element.getAttribute("container-class"); if (element.hasAttribute("container")) { if (StringUtils.hasText(containerClass)) { @@ -182,12 +184,16 @@ public class JmsMessageDrivenEndpointParser extends AbstractSingleBeanDefinition "subscriptionName"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "client-id"); builder.addPropertyValue("autoStartup", false); - return BeanDefinitionReaderUtils.registerWithGeneratedName(builder.getBeanDefinition(), parserContext.getRegistry()); + String beanName = adapterBeanNameRoot(element, parserContext, adapterBeanDefinition) + + ".container"; + parserContext.getRegistry().registerBeanDefinition(beanName, builder.getBeanDefinition()); + return beanName; } - private String parseMessageListener(Element element, ParserContext parserContext) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition( - "org.springframework.integration.jms.ChannelPublishingJmsMessageListener"); + private String parseMessageListener(Element element, ParserContext parserContext, + BeanDefinition adapterBeanDefinition) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder + .genericBeanDefinition(ChannelPublishingJmsMessageListener.class); builder.addPropertyValue("expectReply", this.expectReply); if (this.expectReply) { IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "request-channel"); @@ -233,11 +239,22 @@ public class JmsMessageDrivenEndpointParser extends AbstractSingleBeanDefinition IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "error-channel"); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converter"); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "header-mapper"); + String alias = adapterBeanNameRoot(element, parserContext, adapterBeanDefinition) + + ".listener"; BeanDefinition beanDefinition = builder.getBeanDefinition(); String beanName = BeanDefinitionReaderUtils.generateBeanName(beanDefinition, parserContext.getRegistry()); - BeanComponentDefinition component = new BeanComponentDefinition(beanDefinition, beanName); + BeanComponentDefinition component = new BeanComponentDefinition(beanDefinition, beanName, new String[] { alias }); parserContext.registerBeanComponent(component); return beanName; } + private String adapterBeanNameRoot(Element element, ParserContext parserContext, + BeanDefinition adapterBeanDefinition) { + String beanName = element.getAttribute(ID_ATTRIBUTE); + if (!StringUtils.hasText(beanName)) { + beanName = BeanDefinitionReaderUtils.generateBeanName(adapterBeanDefinition, parserContext.getRegistry()); + } + return beanName; + } + } diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests-context.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests-context.xml index 5e56755304..6f444fc398 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests-context.xml +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests-context.xml @@ -79,6 +79,9 @@ container-type="simple"/> + container-class="${container.class}" /> + + diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests.java b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests.java index c8b061ad2a..d8370cd68d 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests.java +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests.java @@ -17,8 +17,6 @@ package org.springframework.integration.jms.config; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import java.util.List; @@ -117,6 +115,9 @@ public class JmsChannelParserTests { @Autowired private MessageChannel withContainerClass; + @Autowired + private MessageChannel withContainerClassSpEL; + @Autowired private MessageBuilderFactory messageBuilderFactory; @@ -300,6 +301,14 @@ public class JmsChannelParserTests { assertEquals("custom.container.queue", container.getDestinationName()); } + @Test + public void withContainerClassSpEL() { + CustomTestMessageListenerContainer container = TestUtils.getPropertyValue( + withContainerClassSpEL, "container", + CustomTestMessageListenerContainer.class); + assertEquals("custom.container.queue", container.getDestinationName()); + } + static class TestDestinationResolver implements DestinationResolver { diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsMessageDrivenChannelAdapterParserTests.java b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsMessageDrivenChannelAdapterParserTests.java index c458d1c7fe..77267a1534 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsMessageDrivenChannelAdapterParserTests.java +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsMessageDrivenChannelAdapterParserTests.java @@ -173,6 +173,29 @@ public class JmsMessageDrivenChannelAdapterParserTests { assertSame(channel, TestUtils.getPropertyValue(adapter, "listener.gatewayDelegate.requestChannel")); adapter.start(); FooContainer container = TestUtils.getPropertyValue(adapter, "listenerContainer", FooContainer.class); + assertSame(container, context.getBean("adapterWithIdleConsumerLimit.container")); + assertEquals(33, new DirectFieldAccessor(container).getPropertyValue("idleConsumerLimit")); + assertEquals(3, new DirectFieldAccessor(container).getPropertyValue("cacheLevel")); + assertSame(context.getBean("adapterWithIdleConsumerLimit.listener"), + TestUtils.getPropertyValue(container, "messageListener")); + adapter.stop(); + + adapter = context.getBean("adapterWithIdleConsumerLimit2.adapter", JmsMessageDrivenEndpoint.class); + channel = context.getBean("adapterWithIdleConsumerLimit2", MessageChannel.class); + assertSame(channel, TestUtils.getPropertyValue(adapter, "listener.gatewayDelegate.requestChannel")); + adapter.start(); + container = TestUtils.getPropertyValue(adapter, "listenerContainer", FooContainer.class); + assertSame(container, context.getBean("adapterWithIdleConsumerLimit2.container")); + assertEquals(33, new DirectFieldAccessor(container).getPropertyValue("idleConsumerLimit")); + assertEquals(3, new DirectFieldAccessor(container).getPropertyValue("cacheLevel")); + adapter.stop(); + + adapter = context.getBean("org.springframework.integration.jms.JmsMessageDrivenEndpoint#0", JmsMessageDrivenEndpoint.class); + channel = context.getBean("in", MessageChannel.class); + assertSame(channel, TestUtils.getPropertyValue(adapter, "listener.gatewayDelegate.requestChannel")); + adapter.start(); + container = TestUtils.getPropertyValue(adapter, "listenerContainer", FooContainer.class); + assertSame(container, context.getBean("org.springframework.integration.jms.JmsMessageDrivenEndpoint#0.container")); assertEquals(33, new DirectFieldAccessor(container).getPropertyValue("idleConsumerLimit")); assertEquals(3, new DirectFieldAccessor(container).getPropertyValue("cacheLevel")); adapter.stop(); diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/channel.properties b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/channel.properties index a5f2767c3c..7461bd2970 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/channel.properties +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/channel.properties @@ -1,2 +1,3 @@ queue=testQueue -concurrency=5-25 \ No newline at end of file +concurrency=5-25 +container.class=org.springframework.integration.jms.config.JmsChannelParserTests$CustomTestMessageListenerContainer diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithContainerClass.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithContainerClass.xml index 34bba45821..ed337b7600 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithContainerClass.xml +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithContainerClass.xml @@ -3,21 +3,47 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:si="http://www.springframework.org/schema/integration" xmlns:jms="http://www.springframework.org/schema/integration/jms" - xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd - http://www.springframework.org/schema/integration - http://www.springframework.org/schema/integration/spring-integration.xsd - http://www.springframework.org/schema/integration/jms - http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd"> + xmlns:context="http://www.springframework.org/schema/context" + xmlns:util="http://www.springframework.org/schema/util" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd + http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd + http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> + + + org.springframework.integration.jms.config.JmsMessageDrivenChannelAdapterParserTests$FooContainer + + + + + + + + + +