Skip to content

Commit dc24944

Browse files
committed
SPR-6460 Added "phase" attribute to the JMS "listener-container" element.
1 parent b444220 commit dc24944

File tree

4 files changed

+47
-2
lines changed

4 files changed

+47
-2
lines changed

org.springframework.jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ class JmsListenerContainerParser extends AbstractListenerContainerParser {
4444

4545
private static final String ERROR_HANDLER_ATTRIBUTE = "error-handler";
4646

47+
private static final String PHASE_ATTRIBUTE = "phase";
48+
4749
private static final String CACHE_ATTRIBUTE = "cache";
4850

4951

@@ -107,6 +109,11 @@ else if ("simple102".equals(containerType)) {
107109
new RuntimeBeanReference(destinationResolverBeanName));
108110
}
109111

112+
String phase = containerEle.getAttribute(PHASE_ATTRIBUTE);
113+
if (StringUtils.hasText(phase)) {
114+
containerDef.getPropertyValues().add("phase", phase);
115+
}
116+
110117
String cache = containerEle.getAttribute(CACHE_ATTRIBUTE);
111118
if (StringUtils.hasText(cache)) {
112119
if (containerType.startsWith("simple")) {

org.springframework.jms/src/main/resources/org/springframework/jms/config/spring-jms-3.0.xsd

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,16 @@
233233
]]></xsd:documentation>
234234
</xsd:annotation>
235235
</xsd:attribute>
236+
<xsd:attribute name="phase" type="xsd:string">
237+
<xsd:annotation>
238+
<xsd:documentation><![CDATA[
239+
The lifecycle phase within which this container should start and stop. The lower
240+
the value the earlier this container will start and the later it will stop. The
241+
default is Integer.MAX_VALUE meaning the container will start as late as possible
242+
and stop as soon as possible.
243+
]]></xsd:documentation>
244+
</xsd:annotation>
245+
</xsd:attribute>
236246
</xsd:complexType>
237247
</xsd:element>
238248

org.springframework.jms/src/test/java/org/springframework/jms/config/JmsNamespaceHandlerTests.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.springframework.beans.factory.parsing.PassThroughSourceExtractor;
3838
import org.springframework.beans.factory.parsing.ReaderEventListener;
3939
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
40+
import org.springframework.context.Phased;
4041
import org.springframework.context.support.ClassPathXmlApplicationContext;
4142
import org.springframework.jca.endpoint.GenericMessageEndpointManager;
4243
import org.springframework.jms.listener.DefaultMessageListenerContainer;
@@ -144,6 +145,19 @@ public void testErrorHandlers() {
144145
assertNull(defaultErrorHandler);
145146
}
146147

148+
public void testPhases() {
149+
int phase1 = getPhase("listener1");
150+
int phase2 = getPhase("listener2");
151+
int phase3 = getPhase("listener3");
152+
int phase4 = getPhase("listener4");
153+
int defaultPhase = getPhase(DefaultMessageListenerContainer.class.getName() + "#0");
154+
assertEquals(99, phase1);
155+
assertEquals(99, phase2);
156+
assertEquals(Integer.MAX_VALUE, phase3);
157+
assertEquals(Integer.MAX_VALUE, phase4);
158+
assertEquals(Integer.MAX_VALUE, defaultPhase);
159+
}
160+
147161
private MessageListener getListener(String containerBeanName) {
148162
DefaultMessageListenerContainer container = this.context.getBean(containerBeanName, DefaultMessageListenerContainer.class);
149163
return (MessageListener) container.getMessageListener();
@@ -154,6 +168,14 @@ private ErrorHandler getErrorHandler(String containerBeanName) {
154168
return (ErrorHandler) new DirectFieldAccessor(container).getPropertyValue("errorHandler");
155169
}
156170

171+
public int getPhase(String containerBeanName) {
172+
Object container = this.context.getBean(containerBeanName);
173+
if (!(container instanceof Phased)) {
174+
throw new IllegalStateException("Container '" + containerBeanName + "' does not implement Phased.");
175+
}
176+
return ((Phased) container).getPhase();
177+
}
178+
157179
public void testComponentRegistration() {
158180
assertTrue("Parser should have registered a component named 'listener1'", context.containsComponentDefinition("listener1"));
159181
assertTrue("Parser should have registered a component named 'listener2'", context.containsComponentDefinition("listener2"));

org.springframework.jms/src/test/java/org/springframework/jms/config/jmsNamespaceHandlerTests.xml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77

88
<jms:listener-container connection-factory="testConnectionFactory" task-executor="testTaskExecutor"
99
destination-resolver="testDestinationResolver" message-converter="testMessageConverter"
10-
transaction-manager="testTransactionManager" error-handler="testErrorHandler">
10+
transaction-manager="testTransactionManager" error-handler="testErrorHandler" phase="99">
1111
<jms:listener id="listener1" destination="testDestination" ref="testBean1" method="setName"/>
1212
<jms:listener id="listener2" destination="testDestination" ref="testBean2" method="setName" response-destination="responseDestination"/>
1313
</jms:listener-container>
1414

15-
<jms:listener-container>
15+
<!-- TODO: remove the task-executor reference once issue with blocking on stop is resolved -->
16+
<jms:listener-container task-executor="testTaskExecutor">
1617
<jms:listener destination="testDestination" ref="testBean3"/>
1718
</jms:listener-container>
1819

@@ -54,4 +55,9 @@
5455

5556
<bean id="testBean3" class="org.springframework.jms.config.JmsNamespaceHandlerTests$TestMessageListener"/>
5657

58+
<!-- TODO: remove this once issue with blocking on stop is resolved -->
59+
<bean id="lifecycleProcessor" class="org.springframework.context.support.DefaultLifecycleProcessor">
60+
<property name="timeoutPerShutdownPhase" value="0"/>
61+
</bean>
62+
5763
</beans>

0 commit comments

Comments
 (0)