diff --git a/org.springframework.jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java b/org.springframework.jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java
index 668f8c9d839..950316c44ed 100644
--- a/org.springframework.jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java
+++ b/org.springframework.jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java
@@ -44,6 +44,8 @@ class JmsListenerContainerParser extends AbstractListenerContainerParser {
private static final String ERROR_HANDLER_ATTRIBUTE = "error-handler";
+ private static final String PHASE_ATTRIBUTE = "phase";
+
private static final String CACHE_ATTRIBUTE = "cache";
@@ -107,6 +109,11 @@ class JmsListenerContainerParser extends AbstractListenerContainerParser {
new RuntimeBeanReference(destinationResolverBeanName));
}
+ String phase = containerEle.getAttribute(PHASE_ATTRIBUTE);
+ if (StringUtils.hasText(phase)) {
+ containerDef.getPropertyValues().add("phase", phase);
+ }
+
String cache = containerEle.getAttribute(CACHE_ATTRIBUTE);
if (StringUtils.hasText(cache)) {
if (containerType.startsWith("simple")) {
diff --git a/org.springframework.jms/src/main/resources/org/springframework/jms/config/spring-jms-3.0.xsd b/org.springframework.jms/src/main/resources/org/springframework/jms/config/spring-jms-3.0.xsd
index 1ba1f277702..4ee34a8d003 100644
--- a/org.springframework.jms/src/main/resources/org/springframework/jms/config/spring-jms-3.0.xsd
+++ b/org.springframework.jms/src/main/resources/org/springframework/jms/config/spring-jms-3.0.xsd
@@ -233,6 +233,16 @@
]]>
+
+
+
+
+
diff --git a/org.springframework.jms/src/test/java/org/springframework/jms/config/JmsNamespaceHandlerTests.java b/org.springframework.jms/src/test/java/org/springframework/jms/config/JmsNamespaceHandlerTests.java
index 67a46459ba2..0480804277c 100644
--- a/org.springframework.jms/src/test/java/org/springframework/jms/config/JmsNamespaceHandlerTests.java
+++ b/org.springframework.jms/src/test/java/org/springframework/jms/config/JmsNamespaceHandlerTests.java
@@ -37,6 +37,7 @@ import org.springframework.beans.factory.parsing.EmptyReaderEventListener;
import org.springframework.beans.factory.parsing.PassThroughSourceExtractor;
import org.springframework.beans.factory.parsing.ReaderEventListener;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
+import org.springframework.context.Phased;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jca.endpoint.GenericMessageEndpointManager;
import org.springframework.jms.listener.DefaultMessageListenerContainer;
@@ -144,6 +145,19 @@ public class JmsNamespaceHandlerTests extends TestCase {
assertNull(defaultErrorHandler);
}
+ public void testPhases() {
+ int phase1 = getPhase("listener1");
+ int phase2 = getPhase("listener2");
+ int phase3 = getPhase("listener3");
+ int phase4 = getPhase("listener4");
+ int defaultPhase = getPhase(DefaultMessageListenerContainer.class.getName() + "#0");
+ assertEquals(99, phase1);
+ assertEquals(99, phase2);
+ assertEquals(Integer.MAX_VALUE, phase3);
+ assertEquals(Integer.MAX_VALUE, phase4);
+ assertEquals(Integer.MAX_VALUE, defaultPhase);
+ }
+
private MessageListener getListener(String containerBeanName) {
DefaultMessageListenerContainer container = this.context.getBean(containerBeanName, DefaultMessageListenerContainer.class);
return (MessageListener) container.getMessageListener();
@@ -154,6 +168,14 @@ public class JmsNamespaceHandlerTests extends TestCase {
return (ErrorHandler) new DirectFieldAccessor(container).getPropertyValue("errorHandler");
}
+ public int getPhase(String containerBeanName) {
+ Object container = this.context.getBean(containerBeanName);
+ if (!(container instanceof Phased)) {
+ throw new IllegalStateException("Container '" + containerBeanName + "' does not implement Phased.");
+ }
+ return ((Phased) container).getPhase();
+ }
+
public void testComponentRegistration() {
assertTrue("Parser should have registered a component named 'listener1'", context.containsComponentDefinition("listener1"));
assertTrue("Parser should have registered a component named 'listener2'", context.containsComponentDefinition("listener2"));
diff --git a/org.springframework.jms/src/test/java/org/springframework/jms/config/jmsNamespaceHandlerTests.xml b/org.springframework.jms/src/test/java/org/springframework/jms/config/jmsNamespaceHandlerTests.xml
index 275eb3a561e..0aa40c42265 100644
--- a/org.springframework.jms/src/test/java/org/springframework/jms/config/jmsNamespaceHandlerTests.xml
+++ b/org.springframework.jms/src/test/java/org/springframework/jms/config/jmsNamespaceHandlerTests.xml
@@ -7,12 +7,13 @@
+ transaction-manager="testTransactionManager" error-handler="testErrorHandler" phase="99">
-
+
+
@@ -54,4 +55,9 @@
+
+
+
+
+