From dc24944cd9a237d7496e6f5db21e98692263502a Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Fri, 27 Nov 2009 17:42:30 +0000 Subject: [PATCH] SPR-6460 Added "phase" attribute to the JMS "listener-container" element. --- .../config/JmsListenerContainerParser.java | 7 ++++++ .../jms/config/spring-jms-3.0.xsd | 10 +++++++++ .../jms/config/JmsNamespaceHandlerTests.java | 22 +++++++++++++++++++ .../jms/config/jmsNamespaceHandlerTests.xml | 10 +++++++-- 4 files changed, 47 insertions(+), 2 deletions(-) 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 @@ + + + + +