diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAnnotationDrivenConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAnnotationDrivenConfiguration.java index 5cad42cfc3e..c959a22b18b 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAnnotationDrivenConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAnnotationDrivenConfiguration.java @@ -19,10 +19,13 @@ package org.springframework.boot.autoconfigure.amqp; import java.util.stream.Collectors; import org.springframework.amqp.rabbit.annotation.EnableRabbit; +import org.springframework.amqp.rabbit.config.ContainerCustomizer; import org.springframework.amqp.rabbit.config.DirectRabbitListenerContainerFactory; import org.springframework.amqp.rabbit.config.RabbitListenerConfigUtils; import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.listener.DirectMessageListenerContainer; +import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; import org.springframework.amqp.rabbit.retry.MessageRecoverer; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.beans.factory.ObjectProvider; @@ -48,14 +51,23 @@ class RabbitAnnotationDrivenConfiguration { private final ObjectProvider retryTemplateCustomizers; + private final ObjectProvider> simpleContainerCustomizer; + + private final ObjectProvider> directContainerCustomizer; + private final RabbitProperties properties; RabbitAnnotationDrivenConfiguration(ObjectProvider messageConverter, ObjectProvider messageRecoverer, - ObjectProvider retryTemplateCustomizers, RabbitProperties properties) { + ObjectProvider retryTemplateCustomizers, + ObjectProvider> simpleContainerCustomizer, + ObjectProvider> directContainerCustomizer, + RabbitProperties properties) { this.messageConverter = messageConverter; this.messageRecoverer = messageRecoverer; this.retryTemplateCustomizers = retryTemplateCustomizers; + this.simpleContainerCustomizer = simpleContainerCustomizer; + this.directContainerCustomizer = directContainerCustomizer; this.properties = properties; } @@ -79,6 +91,7 @@ class RabbitAnnotationDrivenConfiguration { SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); configurer.configure(factory, connectionFactory); + this.simpleContainerCustomizer.ifUnique(factory::setContainerCustomizer); return factory; } @@ -101,6 +114,7 @@ class RabbitAnnotationDrivenConfiguration { DirectRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) { DirectRabbitListenerContainerFactory factory = new DirectRabbitListenerContainerFactory(); configurer.configure(factory, connectionFactory); + this.directContainerCustomizer.ifUnique(factory::setContainerCustomizer); return factory; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfigurationTests.java index dba9917b9e6..31a523435cf 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfigurationTests.java @@ -37,7 +37,9 @@ import org.springframework.amqp.core.AcknowledgeMode; import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.EnableRabbit; +import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.amqp.rabbit.config.AbstractRabbitListenerContainerFactory; +import org.springframework.amqp.rabbit.config.ContainerCustomizer; import org.springframework.amqp.rabbit.config.DirectRabbitListenerContainerFactory; import org.springframework.amqp.rabbit.config.RabbitListenerConfigUtils; import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; @@ -49,7 +51,9 @@ import org.springframework.amqp.rabbit.connection.ConnectionNameStrategy; import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.amqp.rabbit.core.RabbitMessagingTemplate; import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.amqp.rabbit.listener.DirectMessageListenerContainer; import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory; +import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; import org.springframework.amqp.rabbit.retry.MessageRecoverer; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.beans.factory.NoSuchBeanDefinitionException; @@ -849,6 +853,20 @@ class RabbitAutoConfigurationTests { }); } + @Test + void simpleContainerCustomizer() { + this.contextRunner.withUserConfiguration(SimpleContainerCustomizerConfiguration.class).run( + (context) -> assertThat(context.getBean(SimpleContainerCustomizerConfiguration.class).customizerCalled) + .isTrue()); + } + + @Test + void directContainerCustomizer() { + this.contextRunner.withUserConfiguration(DirectContainerCustomizerConfiguration.class) + .withPropertyValues("spring.rabbitmq.listener.type:direct").run((context) -> assertThat( + context.getBean(DirectContainerCustomizerConfiguration.class).customizerCalled).isTrue()); + } + private com.rabbitmq.client.ConnectionFactory getTargetConnectionFactory(AssertableApplicationContext context) { CachingConnectionFactory connectionFactory = context.getBean(CachingConnectionFactory.class); return connectionFactory.getRabbitConnectionFactory(); @@ -1113,4 +1131,36 @@ class RabbitAutoConfigurationTests { } + @Configuration(proxyBeanMethods = false) + static class SimpleContainerCustomizerConfiguration { + + boolean customizerCalled; + + @RabbitListener(queues = "test", autoStartup = "false") + void listen(String in) { + } + + @Bean + ContainerCustomizer customizer() { + return (container) -> this.customizerCalled = true; + } + + } + + @Configuration(proxyBeanMethods = false) + static class DirectContainerCustomizerConfiguration { + + boolean customizerCalled; + + @RabbitListener(queues = "test", autoStartup = "false") + void listen(String in) { + } + + @Bean + ContainerCustomizer customizer() { + return (container) -> this.customizerCalled = true; + } + + } + }