Skip to content

Commit 0400b68

Browse files
committed
SPR-6240 Added namespace support for ErrorHandler strategy on JMS "listener-container" elements.
1 parent 0e85c66 commit 0400b68

File tree

4 files changed

+52
-5
lines changed

4 files changed

+52
-5
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2008 the original author or authors.
2+
* Copyright 2002-2009 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -42,6 +42,8 @@ class JmsListenerContainerParser extends AbstractListenerContainerParser {
4242

4343
private static final String TASK_EXECUTOR_ATTRIBUTE = "task-executor";
4444

45+
private static final String ERROR_HANDLER_ATTRIBUTE = "error-handler";
46+
4547
private static final String CACHE_ATTRIBUTE = "cache";
4648

4749

@@ -93,6 +95,12 @@ else if ("simple102".equals(containerType)) {
9395
new RuntimeBeanReference(taskExecutorBeanName));
9496
}
9597

98+
String errorHandlerBeanName = containerEle.getAttribute(ERROR_HANDLER_ATTRIBUTE);
99+
if (StringUtils.hasText(errorHandlerBeanName)) {
100+
containerDef.getPropertyValues().addPropertyValue("errorHandler",
101+
new RuntimeBeanReference(errorHandlerBeanName));
102+
}
103+
96104
String destinationResolverBeanName = containerEle.getAttribute(DESTINATION_RESOLVER_ATTRIBUTE);
97105
if (StringUtils.hasText(destinationResolverBeanName)) {
98106
containerDef.getPropertyValues().addPropertyValue("destinationResolver",

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,19 @@
125125
</xsd:appinfo>
126126
</xsd:annotation>
127127
</xsd:attribute>
128+
<xsd:attribute name="error-handler" type="xsd:string">
129+
<xsd:annotation>
130+
<xsd:documentation><![CDATA[
131+
A reference to an ErrorHandler strategy for handling any uncaught Exceptions
132+
that may occur during the execution of the MessageListener.
133+
]]></xsd:documentation>
134+
<xsd:appinfo>
135+
<tool:annotation kind="ref">
136+
<tool:expected-type type="org.springframework.util.ErrorHandler"/>
137+
</tool:annotation>
138+
</xsd:appinfo>
139+
</xsd:annotation>
140+
</xsd:attribute>
128141
<xsd:attribute name="destination-type" default="queue">
129142
<xsd:annotation>
130143
<xsd:documentation><![CDATA[

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import junit.framework.TestCase;
2929
import org.easymock.MockControl;
3030

31-
import org.springframework.beans.BeansException;
31+
import org.springframework.beans.DirectFieldAccessor;
3232
import org.springframework.beans.TestBean;
3333
import org.springframework.beans.factory.config.BeanDefinition;
3434
import org.springframework.beans.factory.parsing.ComponentDefinition;
@@ -41,6 +41,7 @@
4141
import org.springframework.jca.endpoint.GenericMessageEndpointManager;
4242
import org.springframework.jms.listener.DefaultMessageListenerContainer;
4343
import org.springframework.jms.listener.endpoint.JmsMessageEndpointManager;
44+
import org.springframework.util.ErrorHandler;
4445

4546
/**
4647
* @author Mark Fisher
@@ -133,11 +134,26 @@ public void testListeners() throws Exception {
133134
control3.verify();
134135
}
135136

137+
public void testErrorHandlers() {
138+
ErrorHandler expected = this.context.getBean("testErrorHandler", ErrorHandler.class);
139+
ErrorHandler errorHandler1 = getErrorHandler("listener1");
140+
ErrorHandler errorHandler2 = getErrorHandler("listener2");
141+
ErrorHandler defaultErrorHandler = getErrorHandler(DefaultMessageListenerContainer.class.getName() + "#0");
142+
assertSame(expected, errorHandler1);
143+
assertSame(expected, errorHandler2);
144+
assertNull(defaultErrorHandler);
145+
}
146+
136147
private MessageListener getListener(String containerBeanName) {
137148
DefaultMessageListenerContainer container = this.context.getBean(containerBeanName, DefaultMessageListenerContainer.class);
138149
return (MessageListener) container.getMessageListener();
139150
}
140151

152+
private ErrorHandler getErrorHandler(String containerBeanName) {
153+
DefaultMessageListenerContainer container = this.context.getBean(containerBeanName, DefaultMessageListenerContainer.class);
154+
return (ErrorHandler) new DirectFieldAccessor(container).getPropertyValue("errorHandler");
155+
}
156+
141157
public void testComponentRegistration() {
142158
assertTrue("Parser should have registered a component named 'listener1'", context.containsComponentDefinition("listener1"));
143159
assertTrue("Parser should have registered a component named 'listener2'", context.containsComponentDefinition("listener2"));
@@ -231,4 +247,12 @@ public void componentRegistered(ComponentDefinition componentDefinition) {
231247
}
232248
}
233249

250+
251+
static class TestErrorHandler implements ErrorHandler {
252+
253+
@Override
254+
public void handleError(Throwable t) {
255+
}
256+
}
257+
234258
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
<beans xmlns="http://www.springframework.org/schema/beans"
33
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
44
xmlns:jms="http://www.springframework.org/schema/jms"
5-
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
6-
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-2.5.xsd">
5+
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
6+
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd">
77

88
<jms:listener-container connection-factory="testConnectionFactory" task-executor="testTaskExecutor"
99
destination-resolver="testDestinationResolver" message-converter="testMessageConverter"
10-
transaction-manager="testTransactionManager">
10+
transaction-manager="testTransactionManager" error-handler="testErrorHandler">
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>
@@ -46,6 +46,8 @@
4646

4747
<bean id="testTransactionManager" class="org.springframework.transaction.CallCountingTransactionManager"/>
4848

49+
<bean id="testErrorHandler" class="org.springframework.jms.config.JmsNamespaceHandlerTests$TestErrorHandler"/>
50+
4951
<bean id="testBean1" class="org.springframework.beans.TestBean"/>
5052

5153
<bean id="testBean2" class="org.springframework.beans.TestBean"/>

0 commit comments

Comments
 (0)