diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsChannelParser.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsChannelParser.java
index a640f70705..3b03ac35c2 100644
--- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsChannelParser.java
+++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsChannelParser.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2010 the original author or authors.
+ * Copyright 2002-2012 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.
@@ -24,7 +24,6 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.config.xml.AbstractChannelParser;
import org.springframework.integration.config.xml.IntegrationNamespaceUtils;
-import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
@@ -33,6 +32,7 @@ import org.springframework.util.StringUtils;
*
* @author Mark Fisher
* @author Oleg Zhurakusky
+ * @author Gary Russell
* @since 2.0
*/
public class JmsChannelParser extends AbstractChannelParser {
@@ -65,20 +65,23 @@ public class JmsChannelParser extends AbstractChannelParser {
}
String containerType = element.getAttribute(CONTAINER_TYPE_ATTRIBUTE);
String containerClass = element.getAttribute(CONTAINER_CLASS_ATTRIBUTE);
- Assert.isTrue(!(StringUtils.hasText(containerType) && StringUtils.hasText(containerClass)),
- "At most one of '" + CONTAINER_TYPE_ATTRIBUTE + "' or '" + CONTAINER_CLASS_ATTRIBUTE + "' may be configured.");
- if ("default".equals(containerType)) {
- containerClass = "org.springframework.jms.listener.DefaultMessageListenerContainer";
- }
- else if ("simple".equals(containerType)) {
- containerClass = "org.springframework.jms.listener.SimpleMessageListenerContainer";
- }
- if (StringUtils.hasText(containerClass)) {
- builder.addPropertyValue("containerType", containerClass);
- if (containerClass.contains("DefaultMessageListenerContainer")) {
- containerType = "default";
+ if (!StringUtils.hasText(containerClass)) {
+ if ("default".equals(containerType)) {
+ containerClass = "org.springframework.jms.listener.DefaultMessageListenerContainer";
+ }
+ else if ("simple".equals(containerType)) {
+ containerClass = "org.springframework.jms.listener.SimpleMessageListenerContainer";
}
}
+ /*
+ * Schema docs tell the user to ensure that, if they supply a container-class, it
+ * is their responsibility to set the container-type appropriately, based on the superclass
+ * of their implementation (default="default"). If it is set incorrectly, some attributes
+ * may not be applied.
+ *
+ * We cannot reliably infer it here.
+ */
+ builder.addPropertyValue("containerType", containerClass);
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "receive-timeout");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "task-executor");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "transaction-manager");
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 1c38494cc9..3060721916 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
@@ -59,9 +59,19 @@
-
-
+
+
+
+
+
+
+
+
+
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 ed5d255540..5210ffa2eb 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
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2010 the original author or authors.
+ * Copyright 2002-2012 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.
@@ -29,7 +29,6 @@ import javax.jms.Topic;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
-
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.AbstractApplicationContext;
@@ -42,12 +41,14 @@ import org.springframework.integration.test.util.TestUtils;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.listener.AbstractMessageListenerContainer;
import org.springframework.jms.listener.DefaultMessageListenerContainer;
+import org.springframework.jms.listener.SimpleMessageListenerContainer;
import org.springframework.jms.support.destination.DestinationResolver;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Mark Fisher
+ * @author Gary Russell
*/
@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@@ -95,6 +96,18 @@ public class JmsChannelParserTests {
@Autowired
private Topic topic;
+ @Autowired
+ private MessageChannel withDefaultContainer;
+
+ @Autowired
+ private MessageChannel withExplicitDefaultContainer;
+
+ @Autowired
+ private MessageChannel withSimpleContainer;
+
+ @Autowired
+ private MessageChannel withContainerClass;
+
@Autowired
private AbstractApplicationContext context;
@@ -231,6 +244,38 @@ public class JmsChannelParserTests {
System.out.println(container.getMaxConcurrentConsumers());
}
+ @Test
+ public void withDefaultContainer() {
+ DefaultMessageListenerContainer container = TestUtils.getPropertyValue(
+ withDefaultContainer, "container",
+ DefaultMessageListenerContainer.class);
+ assertEquals("default.container.queue", container.getDestinationName());
+ }
+
+ @Test
+ public void withExplicitDefaultContainer() {
+ DefaultMessageListenerContainer container = TestUtils.getPropertyValue(
+ withExplicitDefaultContainer, "container",
+ DefaultMessageListenerContainer.class);
+ assertEquals("explicit.default.container.queue", container.getDestinationName());
+ }
+
+ @Test
+ public void withSimpleContainer() {
+ SimpleMessageListenerContainer container = TestUtils.getPropertyValue(
+ withSimpleContainer, "container",
+ SimpleMessageListenerContainer.class);
+ assertEquals("simple.container.queue", container.getDestinationName());
+ }
+
+ @Test
+ public void withContainerClass() {
+ CustomTestMessageListenerContainer container = TestUtils.getPropertyValue(
+ withContainerClass, "container",
+ CustomTestMessageListenerContainer.class);
+ assertEquals("custom.container.queue", container.getDestinationName());
+ }
+
static class TestDestinationResolver implements DestinationResolver {
@@ -253,4 +298,8 @@ public class JmsChannelParserTests {
static class TestInterceptor extends ChannelInterceptorAdapter {
}
+ static class CustomTestMessageListenerContainer extends DefaultMessageListenerContainer {
+
+ }
+
}