Polish "Add support to auto-configure javax.jms.ExceptionListener"

See gh-25278
pull/25299/head
Stephane Nicoll 4 years ago
parent 1f00c27c7e
commit 8c0c30e7a8

@ -40,12 +40,12 @@ public final class DefaultJmsListenerContainerFactoryConfigurer {
private MessageConverter messageConverter; private MessageConverter messageConverter;
private ExceptionListener exceptionListener;
private JtaTransactionManager transactionManager; private JtaTransactionManager transactionManager;
private JmsProperties jmsProperties; private JmsProperties jmsProperties;
private ExceptionListener exceptionListener;
/** /**
* Set the {@link DestinationResolver} to use or {@code null} if no destination * Set the {@link DestinationResolver} to use or {@code null} if no destination
* resolver should be associated with the factory by default. * resolver should be associated with the factory by default.
@ -64,6 +64,15 @@ public final class DefaultJmsListenerContainerFactoryConfigurer {
this.messageConverter = messageConverter; this.messageConverter = messageConverter;
} }
/**
* Set the {@link ExceptionListener} to use or {@code null} if no exception listener
* should be associated by default.
* @param exceptionListener the {@link ExceptionListener}
*/
void setExceptionListener(ExceptionListener exceptionListener) {
this.exceptionListener = exceptionListener;
}
/** /**
* Set the {@link JtaTransactionManager} to use or {@code null} if the JTA support * Set the {@link JtaTransactionManager} to use or {@code null} if the JTA support
* should not be used. * should not be used.
@ -81,14 +90,6 @@ public final class DefaultJmsListenerContainerFactoryConfigurer {
this.jmsProperties = jmsProperties; 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 * Configure the specified jms listener container factory. The factory can be further
* tuned and default settings can be overridden. * tuned and default settings can be overridden.
@ -112,6 +113,9 @@ public final class DefaultJmsListenerContainerFactoryConfigurer {
if (this.messageConverter != null) { if (this.messageConverter != null) {
factory.setMessageConverter(this.messageConverter); factory.setMessageConverter(this.messageConverter);
} }
if (this.exceptionListener != null) {
factory.setExceptionListener(this.exceptionListener);
}
JmsProperties.Listener listener = this.jmsProperties.getListener(); JmsProperties.Listener listener = this.jmsProperties.getListener();
factory.setAutoStartup(listener.isAutoStartup()); factory.setAutoStartup(listener.isAutoStartup());
if (listener.getAcknowledgeMode() != null) { if (listener.getAcknowledgeMode() != null) {
@ -125,9 +129,6 @@ public final class DefaultJmsListenerContainerFactoryConfigurer {
if (receiveTimeout != null) { if (receiveTimeout != null) {
factory.setReceiveTimeout(receiveTimeout.toMillis()); factory.setReceiveTimeout(receiveTimeout.toMillis());
} }
if (this.exceptionListener != null) {
factory.setExceptionListener(this.exceptionListener);
}
} }
} }

@ -212,6 +212,16 @@ class JmsAutoConfigurationTests {
}); });
} }
@Test
void testDefaultContainerFactoryWithExceptionListener() {
ExceptionListener exceptionListener = mock(ExceptionListener.class);
this.contextRunner.withUserConfiguration(EnableJmsConfiguration.class)
.withBean(ExceptionListener.class, () -> exceptionListener).run((context) -> {
DefaultMessageListenerContainer container = getContainer(context, "jmsListenerContainerFactory");
assertThat(container.getExceptionListener()).isSameAs(exceptionListener);
});
}
@Test @Test
void testCustomContainerFactoryWithConfigurer() { void testCustomContainerFactoryWithConfigurer() {
this.contextRunner.withUserConfiguration(TestConfiguration9.class, EnableJmsConfiguration.class) this.contextRunner.withUserConfiguration(TestConfiguration9.class, EnableJmsConfiguration.class)
@ -395,15 +405,6 @@ class JmsAutoConfigurationTests {
.hasBean(JmsListenerConfigUtils.JMS_LISTENER_ENDPOINT_REGISTRY_BEAN_NAME)); .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) @Configuration(proxyBeanMethods = false)
static class TestConfiguration { static class TestConfiguration {
@ -559,16 +560,6 @@ class JmsAutoConfigurationTests {
} }
@Configuration(proxyBeanMethods = false)
static class TestConfiguration11 {
@Bean
ExceptionListener exceptionListener() {
return mock(ExceptionListener.class);
}
}
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@EnableJms @EnableJms
static class EnableJmsConfiguration { static class EnableJmsConfiguration {

@ -5416,7 +5416,7 @@ If a `DestinationResolver` or a `MessageConverter` bean is defined, it is associ
==== Receiving a Message ==== Receiving a Message
When the JMS infrastructure is present, any bean can be annotated with `@JmsListener` to create a listener endpoint. When the JMS infrastructure is present, any bean can be annotated with `@JmsListener` to create a listener endpoint.
If no `JmsListenerContainerFactory` has been defined, a default one is configured automatically. If no `JmsListenerContainerFactory` has been defined, a default one is configured automatically.
If a `DestinationResolver` or a `MessageConverter` beans is defined, it is associated automatically to the default factory. If a `DestinationResolver`, a `MessageConverter`, or a `javax.jms.ExceptionListener` beans are defined, they are associated automatically with the default factory.
By default, the default factory is transactional. By default, the default factory is transactional.
If you run in an infrastructure where a `JtaTransactionManager` is present, it is associated to the listener container by default. If you run in an infrastructure where a `JtaTransactionManager` is present, it is associated to the listener container by default.

Loading…
Cancel
Save