Add support to auto-configure javax.jms.ExceptionListener

See gh-25278
pull/25299/head
Eddú Meléndez 4 years ago committed by Stephane Nicoll
parent 193fdd7bc5
commit 1f00c27c7e

@ -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);
}
}
}

@ -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> messageConverter;
private final ObjectProvider<ExceptionListener> exceptionListener;
private final JmsProperties properties;
JmsAnnotationDrivenConfiguration(ObjectProvider<DestinationResolver> destinationResolver,
ObjectProvider<JtaTransactionManager> transactionManager, ObjectProvider<MessageConverter> messageConverter,
JmsProperties properties) {
ObjectProvider<ExceptionListener> 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;
}

@ -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 {

Loading…
Cancel
Save