From aa0e8a335f27713433b57653aa69d7fdf2ac12e6 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Mon, 22 Aug 2011 10:53:48 -0400 Subject: [PATCH] added support for durable subscription settings --- .../JmsMessageDrivenEndpointParser.java | 6 +- .../jms/config/spring-integration-jms-2.1.xsd | 58 +++++++++++++++++++ .../config/JmsInboundGatewayParserTests.java | 13 +++++ ...essageDrivenChannelAdapterParserTests.java | 15 ++++- .../inboundGatewayWithDurableSubscription.xml | 33 +++++++++++ .../jmsInboundWithDurableSubscription.xml | 33 +++++++++++ 6 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 spring-integration-jms/src/test/java/org/springframework/integration/jms/config/inboundGatewayWithDurableSubscription.xml create mode 100644 spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithDurableSubscription.xml 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 adf904519f..f7bca1e7a3 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 @@ -59,7 +59,8 @@ public class JmsMessageDrivenEndpointParser extends AbstractSingleBeanDefinition "max-messages-per-task", "selector", "receive-timeout", "recovery-interval", "idle-consumer-limit", "idle-task-execution-limit", - "cache-level" + "cache-level", "subscription-durable", "durable-subscription-name", + "client-id" }; @@ -149,6 +150,9 @@ public class JmsMessageDrivenEndpointParser extends AbstractSingleBeanDefinition IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "idle-consumer-limit"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "idle-task-execution-limit"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "cache-level"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "subscription-durable"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "durable-subscription-name"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "client-id"); 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.1.xsd b/spring-integration-jms/src/main/resources/org/springframework/integration/jms/config/spring-integration-jms-2.1.xsd index 3dab7f31f1..06acb59725 100644 --- a/spring-integration-jms/src/main/resources/org/springframework/integration/jms/config/spring-integration-jms-2.1.xsd +++ b/spring-integration-jms/src/main/resources/org/springframework/integration/jms/config/spring-integration-jms-2.1.xsd @@ -377,6 +377,35 @@ + + + + Boolean property indicating whether to make the subscription durable. The durable subscription name to be used can be specified + through the "durableSubscriptionName" property. Default is "false". Set this to "true" to register a durable subscription, + typically in combination with a "durableSubscriptionName" value (unless your message listener class name is good enough as + subscription name). Only makes sense when listening to a topic (pub-sub domain). + + + + + + + The name of a durable subscription to create. To be applied in case of a topic (pub-sub domain) with subscription durability + activated. The durable subscription name needs to be unique within this client's JMS client id. Default is the class name of the + specified message listener. Note: Only 1 concurrent consumer (which is the default of this message listener container) is allowed + for each durable subscription. + + + + + + + The JMS client id for a shared Connection created and used by this container. Note that client ids need to be unique among all + active Connections of the underlying JMS provider. Furthermore, a client id can only be assigned if the original ConnectionFactory + hasn't already assigned one. + + + @@ -621,6 +650,35 @@ + + + + Boolean property indicating whether to make the subscription durable. The durable subscription name to be used can be specified + through the "durableSubscriptionName" property. Default is "false". Set this to "true" to register a durable subscription, + typically in combination with a "durableSubscriptionName" value (unless your message listener class name is good enough as + subscription name). Only makes sense when listening to a topic (pub-sub domain). + + + + + + + The name of a durable subscription to create. To be applied in case of a topic (pub-sub domain) with subscription durability + activated. The durable subscription name needs to be unique within this client's JMS client id. Default is the class name of the + specified message listener. Note: Only 1 concurrent consumer (which is the default of this message listener container) is allowed + for each durable subscription. + + + + + + + The JMS client id for a shared Connection created and used by this container. Note that client ids need to be unique among all + active Connections of the underlying JMS provider. Furthermore, a client id can only be assigned if the original ConnectionFactory + hasn't already assigned one. + + + 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 3957b7d7f7..c63f7716c4 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 @@ -38,6 +38,7 @@ import org.springframework.integration.test.util.TestUtils; import org.springframework.jms.connection.JmsTransactionManager; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.listener.AbstractMessageListenerContainer; +import org.springframework.jms.listener.DefaultMessageListenerContainer; import org.springframework.jms.support.destination.JmsDestinationAccessor; /** @@ -343,6 +344,18 @@ public class JmsInboundGatewayParserTests { assertEquals(Boolean.TRUE, container.isPubSubDomain()); } + @Test + public void gatewayWithDurableSubscription() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "inboundGatewayWithDurableSubscription.xml", this.getClass()); + JmsMessageDrivenEndpoint endpoint = context.getBean("gateway", JmsMessageDrivenEndpoint.class); + DefaultMessageListenerContainer container = (DefaultMessageListenerContainer) new DirectFieldAccessor(endpoint).getPropertyValue("listenerContainer"); + assertEquals(Boolean.TRUE, container.isPubSubDomain()); + assertEquals(Boolean.TRUE, container.isSubscriptionDurable()); + assertEquals("testDurableSubscriptionName", container.getDurableSubscriptionName()); + assertEquals("testClientId", container.getClientId()); + } + @Test public void gatewayWithReplyChannel() { ActiveMqTestUtils.prepare(); 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 d8c97036f9..b610b8af0a 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2011 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. @@ -31,6 +31,7 @@ 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.listener.DefaultMessageListenerContainer; import org.springframework.jms.support.destination.JmsDestinationAccessor; /** @@ -66,6 +67,18 @@ public class JmsMessageDrivenChannelAdapterParserTests { assertEquals(Boolean.TRUE, container.isPubSubDomain()); } + @Test + public void adapterWithDurableSubscription() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "jmsInboundWithDurableSubscription.xml", this.getClass()); + JmsMessageDrivenEndpoint endpoint = context.getBean("messageDrivenAdapter", JmsMessageDrivenEndpoint.class); + DefaultMessageListenerContainer container = (DefaultMessageListenerContainer) new DirectFieldAccessor(endpoint).getPropertyValue("listenerContainer"); + assertEquals(Boolean.TRUE, container.isPubSubDomain()); + assertEquals(Boolean.TRUE, container.isSubscriptionDurable()); + assertEquals("testDurableSubscriptionName", container.getDurableSubscriptionName()); + assertEquals("testClientId", container.getClientId()); + } + @Test public void testGatewayWithReceiveTimeout() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/inboundGatewayWithDurableSubscription.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/inboundGatewayWithDurableSubscription.xml new file mode 100644 index 0000000000..153f83f1c1 --- /dev/null +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/inboundGatewayWithDurableSubscription.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithDurableSubscription.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithDurableSubscription.xml new file mode 100644 index 0000000000..e4a1f8d976 --- /dev/null +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsInboundWithDurableSubscription.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + +