diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/DefaultJmsListenerContainerFactoryConfigurer.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/DefaultJmsListenerContainerFactoryConfigurer.java index ccb1f730b0..86e32462c3 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/DefaultJmsListenerContainerFactoryConfigurer.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/DefaultJmsListenerContainerFactoryConfigurer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.jms; import java.time.Duration; import javax.jms.ConnectionFactory; +import javax.jms.ExceptionListener; import org.springframework.jms.config.DefaultJmsListenerContainerFactory; import org.springframework.jms.support.converter.MessageConverter; @@ -30,6 +31,7 @@ import org.springframework.util.Assert; * Configure {@link DefaultJmsListenerContainerFactory} with sensible defaults. * * @author Stephane Nicoll + * @author Eddú Meléndez * @since 1.3.3 */ public final class DefaultJmsListenerContainerFactoryConfigurer { @@ -42,6 +44,8 @@ public final class DefaultJmsListenerContainerFactoryConfigurer { private JmsProperties jmsProperties; + private ExceptionListener exceptionListener; + /** * Set the {@link DestinationResolver} to use or {@code null} if no destination * resolver should be associated with the factory by default. @@ -77,6 +81,14 @@ public final class DefaultJmsListenerContainerFactoryConfigurer { this.jmsProperties = jmsProperties; } + /** + * Set the {@link ExceptionListener}. + * @param exceptionListener the {@link ExceptionListener} + */ + void setExceptionListener(ExceptionListener exceptionListener) { + this.exceptionListener = exceptionListener; + } + /** * Configure the specified jms listener container factory. The factory can be further * tuned and default settings can be overridden. @@ -113,6 +125,9 @@ public final class DefaultJmsListenerContainerFactoryConfigurer { if (receiveTimeout != null) { factory.setReceiveTimeout(receiveTimeout.toMillis()); } + if (this.exceptionListener != null) { + factory.setExceptionListener(this.exceptionListener); + } } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java index 271a3a9da4..432cba4bff 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package org.springframework.boot.autoconfigure.jms; import javax.jms.ConnectionFactory; +import javax.jms.ExceptionListener; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -38,6 +39,7 @@ import org.springframework.transaction.jta.JtaTransactionManager; * * @author Phillip Webb * @author Stephane Nicoll + * @author Eddú Meléndez */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass(EnableJms.class) @@ -49,14 +51,17 @@ class JmsAnnotationDrivenConfiguration { private final ObjectProvider messageConverter; + private final ObjectProvider exceptionListener; + private final JmsProperties properties; JmsAnnotationDrivenConfiguration(ObjectProvider destinationResolver, ObjectProvider transactionManager, ObjectProvider messageConverter, - JmsProperties properties) { + ObjectProvider exceptionListener, JmsProperties properties) { this.destinationResolver = destinationResolver; this.transactionManager = transactionManager; this.messageConverter = messageConverter; + this.exceptionListener = exceptionListener; this.properties = properties; } @@ -67,6 +72,7 @@ class JmsAnnotationDrivenConfiguration { configurer.setDestinationResolver(this.destinationResolver.getIfUnique()); configurer.setTransactionManager(this.transactionManager.getIfUnique()); configurer.setMessageConverter(this.messageConverter.getIfUnique()); + configurer.setExceptionListener(this.exceptionListener.getIfUnique()); configurer.setJmsProperties(this.properties); return configurer; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfigurationTests.java index 4989e3ce0f..6ab8847629 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package org.springframework.boot.autoconfigure.jms; import javax.jms.ConnectionFactory; +import javax.jms.ExceptionListener; import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; @@ -56,6 +57,7 @@ import static org.mockito.Mockito.mock; * @author Greg Turnquist * @author Stephane Nicoll * @author Aurélien Leboulanger + * @author Eddú Meléndez */ class JmsAutoConfigurationTests { @@ -393,6 +395,15 @@ class JmsAutoConfigurationTests { .hasBean(JmsListenerConfigUtils.JMS_LISTENER_ENDPOINT_REGISTRY_BEAN_NAME)); } + @Test + void testDefaultContainerFactoryWithExceptionListener() { + this.contextRunner.withUserConfiguration(TestConfiguration11.class, EnableJmsConfiguration.class) + .run((context) -> { + DefaultMessageListenerContainer container = getContainer(context, "jmsListenerContainerFactory"); + assertThat(container.getExceptionListener()).isSameAs(context.getBean("exceptionListener")); + }); + } + @Configuration(proxyBeanMethods = false) static class TestConfiguration { @@ -548,6 +559,16 @@ class JmsAutoConfigurationTests { } + @Configuration(proxyBeanMethods = false) + static class TestConfiguration11 { + + @Bean + ExceptionListener exceptionListener() { + return mock(ExceptionListener.class); + } + + } + @Configuration(proxyBeanMethods = false) @EnableJms static class EnableJmsConfiguration {