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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+