Skip to content

Commit d467de5

Browse files
committed
Merge pull request #27625 from garyrussell
* gh-27625: Polish "Apply container customizer bean to AMQP MessageListenerContainer" Apply container customizer bean to AMQP MessageListenerContainer Closes gh-27625
2 parents fc5fd7f + 0ed9085 commit d467de5

File tree

2 files changed

+64
-2
lines changed

2 files changed

+64
-2
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAnnotationDrivenConfiguration.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@
1919
import java.util.stream.Collectors;
2020

2121
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
22+
import org.springframework.amqp.rabbit.config.ContainerCustomizer;
2223
import org.springframework.amqp.rabbit.config.DirectRabbitListenerContainerFactory;
2324
import org.springframework.amqp.rabbit.config.RabbitListenerConfigUtils;
2425
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
2526
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
27+
import org.springframework.amqp.rabbit.listener.DirectMessageListenerContainer;
28+
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
2629
import org.springframework.amqp.rabbit.retry.MessageRecoverer;
2730
import org.springframework.amqp.support.converter.MessageConverter;
2831
import org.springframework.beans.factory.ObjectProvider;
@@ -76,9 +79,11 @@ SimpleRabbitListenerContainerFactoryConfigurer simpleRabbitListenerContainerFact
7679
@ConditionalOnProperty(prefix = "spring.rabbitmq.listener", name = "type", havingValue = "simple",
7780
matchIfMissing = true)
7881
SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(
79-
SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
82+
SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory,
83+
ObjectProvider<ContainerCustomizer<SimpleMessageListenerContainer>> simpleContainerCustomizer) {
8084
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
8185
configurer.configure(factory, connectionFactory);
86+
simpleContainerCustomizer.ifUnique(factory::setContainerCustomizer);
8287
return factory;
8388
}
8489

@@ -98,9 +103,11 @@ DirectRabbitListenerContainerFactoryConfigurer directRabbitListenerContainerFact
98103
@ConditionalOnMissingBean(name = "rabbitListenerContainerFactory")
99104
@ConditionalOnProperty(prefix = "spring.rabbitmq.listener", name = "type", havingValue = "direct")
100105
DirectRabbitListenerContainerFactory directRabbitListenerContainerFactory(
101-
DirectRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
106+
DirectRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory,
107+
ObjectProvider<ContainerCustomizer<DirectMessageListenerContainer>> directContainerCustomizer) {
102108
DirectRabbitListenerContainerFactory factory = new DirectRabbitListenerContainerFactory();
103109
configurer.configure(factory, connectionFactory);
110+
directContainerCustomizer.ifUnique(factory::setContainerCustomizer);
104111
return factory;
105112
}
106113

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfigurationTests.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@
3737
import org.springframework.amqp.core.AmqpAdmin;
3838
import org.springframework.amqp.core.Message;
3939
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
40+
import org.springframework.amqp.rabbit.annotation.RabbitListener;
4041
import org.springframework.amqp.rabbit.config.AbstractRabbitListenerContainerFactory;
42+
import org.springframework.amqp.rabbit.config.ContainerCustomizer;
4143
import org.springframework.amqp.rabbit.config.DirectRabbitListenerContainerFactory;
4244
import org.springframework.amqp.rabbit.config.RabbitListenerConfigUtils;
4345
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
@@ -49,7 +51,9 @@
4951
import org.springframework.amqp.rabbit.core.RabbitAdmin;
5052
import org.springframework.amqp.rabbit.core.RabbitMessagingTemplate;
5153
import org.springframework.amqp.rabbit.core.RabbitTemplate;
54+
import org.springframework.amqp.rabbit.listener.DirectMessageListenerContainer;
5255
import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory;
56+
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
5357
import org.springframework.amqp.rabbit.retry.MessageRecoverer;
5458
import org.springframework.amqp.support.converter.MessageConverter;
5559
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
@@ -60,6 +64,7 @@
6064
import org.springframework.boot.test.system.OutputCaptureExtension;
6165
import org.springframework.context.annotation.Bean;
6266
import org.springframework.context.annotation.Configuration;
67+
import org.springframework.context.annotation.Import;
6368
import org.springframework.context.annotation.Primary;
6469
import org.springframework.core.Ordered;
6570
import org.springframework.core.annotation.Order;
@@ -74,6 +79,7 @@
7479

7580
import static org.assertj.core.api.Assertions.assertThat;
7681
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
82+
import static org.mockito.ArgumentMatchers.any;
7783
import static org.mockito.ArgumentMatchers.anyString;
7884
import static org.mockito.ArgumentMatchers.eq;
7985
import static org.mockito.ArgumentMatchers.isNull;
@@ -849,6 +855,23 @@ void whenMultipleConnectionFactoryCustomizersAreDefinedThenTheyAreCalledInOrder(
849855
});
850856
}
851857

858+
@Test
859+
@SuppressWarnings("unchecked")
860+
void whenASimpleContainerCustomizerIsDefinedThenItIsCalledToConfigureTheContainer() {
861+
this.contextRunner.withUserConfiguration(SimpleContainerCustomizerConfiguration.class)
862+
.run((context) -> verify(context.getBean(ContainerCustomizer.class))
863+
.configure(any(SimpleMessageListenerContainer.class)));
864+
}
865+
866+
@Test
867+
@SuppressWarnings("unchecked")
868+
void whenADirectContainerCustomizerIsDefinedThenItIsCalledToConfigureTheContainer() {
869+
this.contextRunner.withUserConfiguration(DirectContainerCustomizerConfiguration.class)
870+
.withPropertyValues("spring.rabbitmq.listener.type:direct")
871+
.run((context) -> verify(context.getBean(ContainerCustomizer.class))
872+
.configure(any(DirectMessageListenerContainer.class)));
873+
}
874+
852875
private com.rabbitmq.client.ConnectionFactory getTargetConnectionFactory(AssertableApplicationContext context) {
853876
CachingConnectionFactory connectionFactory = context.getBean(CachingConnectionFactory.class);
854877
return connectionFactory.getRabbitConnectionFactory();
@@ -1113,4 +1136,36 @@ ConnectionFactoryCustomizer firstCustomizer() {
11131136

11141137
}
11151138

1139+
@Import(TestListener.class)
1140+
@Configuration(proxyBeanMethods = false)
1141+
static class SimpleContainerCustomizerConfiguration {
1142+
1143+
@Bean
1144+
@SuppressWarnings("unchecked")
1145+
ContainerCustomizer<SimpleMessageListenerContainer> customizer() {
1146+
return mock(ContainerCustomizer.class);
1147+
}
1148+
1149+
}
1150+
1151+
@Import(TestListener.class)
1152+
@Configuration(proxyBeanMethods = false)
1153+
static class DirectContainerCustomizerConfiguration {
1154+
1155+
@Bean
1156+
@SuppressWarnings("unchecked")
1157+
ContainerCustomizer<DirectMessageListenerContainer> customizer() {
1158+
return mock(ContainerCustomizer.class);
1159+
}
1160+
1161+
}
1162+
1163+
static class TestListener {
1164+
1165+
@RabbitListener(queues = "test", autoStartup = "false")
1166+
void listen(String in) {
1167+
}
1168+
1169+
}
1170+
11161171
}

0 commit comments

Comments
 (0)