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 b9ec0d79ee..1dc54971d0 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 @@ -56,7 +56,9 @@ public class JmsMessageDrivenEndpointParser extends AbstractSingleBeanDefinition JmsAdapterParserUtils.DESTINATION_NAME_ATTRIBUTE, "destination-resolver", "transaction-manager", "concurrent-consumers", "max-concurrent-consumers", - "max-messages-per-task", "idle-task-execution-limit", "selector" + "max-messages-per-task", "selector", + "receive-timeout", "recovery-interval", + "idle-consumer-limit", "idle-task-execution-limit" }; @@ -141,6 +143,9 @@ public class JmsMessageDrivenEndpointParser extends AbstractSingleBeanDefinition IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "concurrent-consumers"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "max-concurrent-consumers"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "max-messages-per-task"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "receive-timeout"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "recovery-interval"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "idle-consumer-limit"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "idle-task-execution-limit"); builder.addPropertyValue("autoStartup", false); return BeanDefinitionReaderUtils.registerWithGeneratedName(builder.getBeanDefinition(), parserContext.getRegistry()); diff --git a/spring-integration-jms/src/main/resources/org/springframework/integration/jms/config/spring-integration-jms-2.0.xsd b/spring-integration-jms/src/main/resources/org/springframework/integration/jms/config/spring-integration-jms-2.0.xsd index fa12d56026..732751df32 100644 --- a/spring-integration-jms/src/main/resources/org/springframework/integration/jms/config/spring-integration-jms-2.0.xsd +++ b/spring-integration-jms/src/main/resources/org/springframework/integration/jms/config/spring-integration-jms-2.0.xsd @@ -401,6 +401,9 @@ + + + @@ -544,6 +547,9 @@ + + + diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsInboundGatewayParserTests.java b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsInboundGatewayParserTests.java index 2a858df9be..ae07536421 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsInboundGatewayParserTests.java +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsInboundGatewayParserTests.java @@ -236,6 +236,30 @@ public class JmsInboundGatewayParserTests { gateway.stop(); } + @Test + public void testGatewayWithReceiveTimeout() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "jmsGatewayWithContainerSettings.xml", this.getClass()); + JmsMessageDrivenEndpoint gateway = (JmsMessageDrivenEndpoint) context.getBean("gatewayWithReceiveTimeout"); + gateway.start(); + AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) + new DirectFieldAccessor(gateway).getPropertyValue("listenerContainer"); + assertEquals(1111L, new DirectFieldAccessor(container).getPropertyValue("receiveTimeout")); + gateway.stop(); + } + + @Test + public void testGatewayWithRecoveryInterval() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "jmsGatewayWithContainerSettings.xml", this.getClass()); + JmsMessageDrivenEndpoint gateway = (JmsMessageDrivenEndpoint) context.getBean("gatewayWithRecoveryInterval"); + gateway.start(); + AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) + new DirectFieldAccessor(gateway).getPropertyValue("listenerContainer"); + assertEquals(2222L, new DirectFieldAccessor(container).getPropertyValue("recoveryInterval")); + gateway.stop(); + } + @Test public void testGatewayWithIdleTaskExecutionLimit() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( @@ -248,6 +272,18 @@ public class JmsInboundGatewayParserTests { gateway.stop(); } + @Test + public void testGatewayWithIdleConsumerLimit() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "jmsGatewayWithContainerSettings.xml", this.getClass()); + JmsMessageDrivenEndpoint gateway = (JmsMessageDrivenEndpoint) context.getBean("gatewayWithIdleConsumerLimit"); + gateway.start(); + AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) + new DirectFieldAccessor(gateway).getPropertyValue("listenerContainer"); + assertEquals(33, new DirectFieldAccessor(container).getPropertyValue("idleConsumerLimit")); + gateway.stop(); + } + @Test public void testGatewayWithContainerReference() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( 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 d8438bd53b..3059a11aad 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 @@ -30,6 +30,7 @@ import org.springframework.integration.core.PollableChannel; import org.springframework.integration.history.MessageHistory; import org.springframework.integration.jms.JmsMessageDrivenEndpoint; import org.springframework.integration.test.util.TestUtils; +import org.springframework.jms.listener.AbstractMessageListenerContainer; import org.springframework.jms.support.destination.JmsDestinationAccessor; /** @@ -65,4 +66,52 @@ public class JmsMessageDrivenChannelAdapterParserTests { assertEquals(Boolean.TRUE, container.isPubSubDomain()); } + @Test + public void testGatewayWithReceiveTimeout() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "jmsInboundWithContainerSettings.xml", this.getClass()); + JmsMessageDrivenEndpoint gateway = (JmsMessageDrivenEndpoint) context.getBean("adapterWithReceiveTimeout"); + gateway.start(); + AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) + new DirectFieldAccessor(gateway).getPropertyValue("listenerContainer"); + assertEquals(1111L, new DirectFieldAccessor(container).getPropertyValue("receiveTimeout")); + gateway.stop(); + } + + @Test + public void testGatewayWithRecoveryInterval() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "jmsInboundWithContainerSettings.xml", this.getClass()); + JmsMessageDrivenEndpoint gateway = (JmsMessageDrivenEndpoint) context.getBean("adapterWithRecoveryInterval"); + gateway.start(); + AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) + new DirectFieldAccessor(gateway).getPropertyValue("listenerContainer"); + assertEquals(2222L, new DirectFieldAccessor(container).getPropertyValue("recoveryInterval")); + gateway.stop(); + } + + @Test + public void testGatewayWithIdleTaskExecutionLimit() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "jmsInboundWithContainerSettings.xml", this.getClass()); + JmsMessageDrivenEndpoint gateway = (JmsMessageDrivenEndpoint) context.getBean("adapterWithIdleTaskExecutionLimit"); + gateway.start(); + AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) + new DirectFieldAccessor(gateway).getPropertyValue("listenerContainer"); + assertEquals(7, new DirectFieldAccessor(container).getPropertyValue("idleTaskExecutionLimit")); + gateway.stop(); + } + + @Test + public void testGatewayWithIdleConsumerLimit() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "jmsInboundWithContainerSettings.xml", this.getClass()); + JmsMessageDrivenEndpoint gateway = (JmsMessageDrivenEndpoint) context.getBean("adapterWithIdleConsumerLimit"); + gateway.start(); + AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) + new DirectFieldAccessor(gateway).getPropertyValue("listenerContainer"); + assertEquals(33, new DirectFieldAccessor(container).getPropertyValue("idleConsumerLimit")); + gateway.stop(); + } + } diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsGatewayWithContainerSettings.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsGatewayWithContainerSettings.xml index cc8e17c82a..7c65299df3 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsGatewayWithContainerSettings.xml +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsGatewayWithContainerSettings.xml @@ -35,6 +35,20 @@ request-pub-sub-domain="false" max-messages-per-task="99"/> + + + + + + diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithContainerSettings.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithContainerSettings.xml new file mode 100644 index 0000000000..7c119b409b --- /dev/null +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithContainerSettings.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + +