Browse Source

SPR-6240 Added namespace support for ErrorHandler strategy on JMS "listener-container" elements.

git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@2217 50f2f4bb-b051-0410-bef5-90022cba6387
pull/1/head
Mark Fisher 16 years ago
parent
commit
9ca67d67a3
  1. 10
      org.springframework.jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java
  2. 13
      org.springframework.jms/src/main/resources/org/springframework/jms/config/spring-jms-3.0.xsd
  3. 26
      org.springframework.jms/src/test/java/org/springframework/jms/config/JmsNamespaceHandlerTests.java
  4. 8
      org.springframework.jms/src/test/java/org/springframework/jms/config/jmsNamespaceHandlerTests.xml

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

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2008 the original author or authors. * Copyright 2002-2009 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -42,6 +42,8 @@ class JmsListenerContainerParser extends AbstractListenerContainerParser {
private static final String TASK_EXECUTOR_ATTRIBUTE = "task-executor"; private static final String TASK_EXECUTOR_ATTRIBUTE = "task-executor";
private static final String ERROR_HANDLER_ATTRIBUTE = "error-handler";
private static final String CACHE_ATTRIBUTE = "cache"; private static final String CACHE_ATTRIBUTE = "cache";
@ -93,6 +95,12 @@ class JmsListenerContainerParser extends AbstractListenerContainerParser {
new RuntimeBeanReference(taskExecutorBeanName)); new RuntimeBeanReference(taskExecutorBeanName));
} }
String errorHandlerBeanName = containerEle.getAttribute(ERROR_HANDLER_ATTRIBUTE);
if (StringUtils.hasText(errorHandlerBeanName)) {
containerDef.getPropertyValues().addPropertyValue("errorHandler",
new RuntimeBeanReference(errorHandlerBeanName));
}
String destinationResolverBeanName = containerEle.getAttribute(DESTINATION_RESOLVER_ATTRIBUTE); String destinationResolverBeanName = containerEle.getAttribute(DESTINATION_RESOLVER_ATTRIBUTE);
if (StringUtils.hasText(destinationResolverBeanName)) { if (StringUtils.hasText(destinationResolverBeanName)) {
containerDef.getPropertyValues().addPropertyValue("destinationResolver", containerDef.getPropertyValues().addPropertyValue("destinationResolver",

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

@ -125,6 +125,19 @@
</xsd:appinfo> </xsd:appinfo>
</xsd:annotation> </xsd:annotation>
</xsd:attribute> </xsd:attribute>
<xsd:attribute name="error-handler" type="xsd:string">
<xsd:annotation>
<xsd:documentation><![CDATA[
A reference to an ErrorHandler strategy for handling any uncaught Exceptions
that may occur during the execution of the MessageListener.
]]></xsd:documentation>
<xsd:appinfo>
<tool:annotation kind="ref">
<tool:expected-type type="org.springframework.util.ErrorHandler"/>
</tool:annotation>
</xsd:appinfo>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="destination-type" default="queue"> <xsd:attribute name="destination-type" default="queue">
<xsd:annotation> <xsd:annotation>
<xsd:documentation><![CDATA[ <xsd:documentation><![CDATA[

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

@ -28,7 +28,7 @@ import javax.jms.TextMessage;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.easymock.MockControl; import org.easymock.MockControl;
import org.springframework.beans.BeansException; import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.TestBean; import org.springframework.beans.TestBean;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.parsing.ComponentDefinition; import org.springframework.beans.factory.parsing.ComponentDefinition;
@ -41,6 +41,7 @@ import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jca.endpoint.GenericMessageEndpointManager; import org.springframework.jca.endpoint.GenericMessageEndpointManager;
import org.springframework.jms.listener.DefaultMessageListenerContainer; import org.springframework.jms.listener.DefaultMessageListenerContainer;
import org.springframework.jms.listener.endpoint.JmsMessageEndpointManager; import org.springframework.jms.listener.endpoint.JmsMessageEndpointManager;
import org.springframework.util.ErrorHandler;
/** /**
* @author Mark Fisher * @author Mark Fisher
@ -133,11 +134,26 @@ public class JmsNamespaceHandlerTests extends TestCase {
control3.verify(); control3.verify();
} }
public void testErrorHandlers() {
ErrorHandler expected = this.context.getBean("testErrorHandler", ErrorHandler.class);
ErrorHandler errorHandler1 = getErrorHandler("listener1");
ErrorHandler errorHandler2 = getErrorHandler("listener2");
ErrorHandler defaultErrorHandler = getErrorHandler(DefaultMessageListenerContainer.class.getName() + "#0");
assertSame(expected, errorHandler1);
assertSame(expected, errorHandler2);
assertNull(defaultErrorHandler);
}
private MessageListener getListener(String containerBeanName) { private MessageListener getListener(String containerBeanName) {
DefaultMessageListenerContainer container = this.context.getBean(containerBeanName, DefaultMessageListenerContainer.class); DefaultMessageListenerContainer container = this.context.getBean(containerBeanName, DefaultMessageListenerContainer.class);
return (MessageListener) container.getMessageListener(); return (MessageListener) container.getMessageListener();
} }
private ErrorHandler getErrorHandler(String containerBeanName) {
DefaultMessageListenerContainer container = this.context.getBean(containerBeanName, DefaultMessageListenerContainer.class);
return (ErrorHandler) new DirectFieldAccessor(container).getPropertyValue("errorHandler");
}
public void testComponentRegistration() { public void testComponentRegistration() {
assertTrue("Parser should have registered a component named 'listener1'", context.containsComponentDefinition("listener1")); assertTrue("Parser should have registered a component named 'listener1'", context.containsComponentDefinition("listener1"));
assertTrue("Parser should have registered a component named 'listener2'", context.containsComponentDefinition("listener2")); assertTrue("Parser should have registered a component named 'listener2'", context.containsComponentDefinition("listener2"));
@ -231,4 +247,12 @@ public class JmsNamespaceHandlerTests extends TestCase {
} }
} }
static class TestErrorHandler implements ErrorHandler {
@Override
public void handleError(Throwable t) {
}
}
} }

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

@ -2,12 +2,12 @@
<beans xmlns="http://www.springframework.org/schema/beans" <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jms="http://www.springframework.org/schema/jms" xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-2.5.xsd"> http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd">
<jms:listener-container connection-factory="testConnectionFactory" task-executor="testTaskExecutor" <jms:listener-container connection-factory="testConnectionFactory" task-executor="testTaskExecutor"
destination-resolver="testDestinationResolver" message-converter="testMessageConverter" destination-resolver="testDestinationResolver" message-converter="testMessageConverter"
transaction-manager="testTransactionManager"> transaction-manager="testTransactionManager" error-handler="testErrorHandler">
<jms:listener id="listener1" destination="testDestination" ref="testBean1" method="setName"/> <jms:listener id="listener1" destination="testDestination" ref="testBean1" method="setName"/>
<jms:listener id="listener2" destination="testDestination" ref="testBean2" method="setName" response-destination="responseDestination"/> <jms:listener id="listener2" destination="testDestination" ref="testBean2" method="setName" response-destination="responseDestination"/>
</jms:listener-container> </jms:listener-container>
@ -46,6 +46,8 @@
<bean id="testTransactionManager" class="org.springframework.transaction.CallCountingTransactionManager"/> <bean id="testTransactionManager" class="org.springframework.transaction.CallCountingTransactionManager"/>
<bean id="testErrorHandler" class="org.springframework.jms.config.JmsNamespaceHandlerTests$TestErrorHandler"/>
<bean id="testBean1" class="org.springframework.beans.TestBean"/> <bean id="testBean1" class="org.springframework.beans.TestBean"/>
<bean id="testBean2" class="org.springframework.beans.TestBean"/> <bean id="testBean2" class="org.springframework.beans.TestBean"/>

Loading…
Cancel
Save