Skip to content

Commit 774941e

Browse files
garyrussellwilkinsona
authored andcommitted
Apply container customizer bean to AMQP MessageListenerContainer
See gh-27625
1 parent fc5fd7f commit 774941e

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

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

Lines changed: 15 additions & 1 deletion
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;
@@ -48,14 +51,23 @@ class RabbitAnnotationDrivenConfiguration {
4851

4952
private final ObjectProvider<RabbitRetryTemplateCustomizer> retryTemplateCustomizers;
5053

54+
private final ObjectProvider<ContainerCustomizer<SimpleMessageListenerContainer>> simpleContainerCustomizer;
55+
56+
private final ObjectProvider<ContainerCustomizer<DirectMessageListenerContainer>> directContainerCustomizer;
57+
5158
private final RabbitProperties properties;
5259

5360
RabbitAnnotationDrivenConfiguration(ObjectProvider<MessageConverter> messageConverter,
5461
ObjectProvider<MessageRecoverer> messageRecoverer,
55-
ObjectProvider<RabbitRetryTemplateCustomizer> retryTemplateCustomizers, RabbitProperties properties) {
62+
ObjectProvider<RabbitRetryTemplateCustomizer> retryTemplateCustomizers,
63+
ObjectProvider<ContainerCustomizer<SimpleMessageListenerContainer>> simpleContainerCustomizer,
64+
ObjectProvider<ContainerCustomizer<DirectMessageListenerContainer>> directContainerCustomizer,
65+
RabbitProperties properties) {
5666
this.messageConverter = messageConverter;
5767
this.messageRecoverer = messageRecoverer;
5868
this.retryTemplateCustomizers = retryTemplateCustomizers;
69+
this.simpleContainerCustomizer = simpleContainerCustomizer;
70+
this.directContainerCustomizer = directContainerCustomizer;
5971
this.properties = properties;
6072
}
6173

@@ -79,6 +91,7 @@ SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(
7991
SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
8092
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
8193
configurer.configure(factory, connectionFactory);
94+
this.simpleContainerCustomizer.ifUnique(factory::setContainerCustomizer);
8295
return factory;
8396
}
8497

@@ -101,6 +114,7 @@ DirectRabbitListenerContainerFactory directRabbitListenerContainerFactory(
101114
DirectRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
102115
DirectRabbitListenerContainerFactory factory = new DirectRabbitListenerContainerFactory();
103116
configurer.configure(factory, connectionFactory);
117+
this.directContainerCustomizer.ifUnique(factory::setContainerCustomizer);
104118
return factory;
105119
}
106120

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

Lines changed: 50 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;
@@ -849,6 +853,20 @@ void whenMultipleConnectionFactoryCustomizersAreDefinedThenTheyAreCalledInOrder(
849853
});
850854
}
851855

856+
@Test
857+
void simpleContainerCustomizer() {
858+
this.contextRunner.withUserConfiguration(SimpleContainerCustomizerConfiguration.class).run(
859+
(context) -> assertThat(context.getBean(SimpleContainerCustomizerConfiguration.class).customizerCalled)
860+
.isTrue());
861+
}
862+
863+
@Test
864+
void directContainerCustomizer() {
865+
this.contextRunner.withUserConfiguration(DirectContainerCustomizerConfiguration.class)
866+
.withPropertyValues("spring.rabbitmq.listener.type:direct").run((context) -> assertThat(
867+
context.getBean(DirectContainerCustomizerConfiguration.class).customizerCalled).isTrue());
868+
}
869+
852870
private com.rabbitmq.client.ConnectionFactory getTargetConnectionFactory(AssertableApplicationContext context) {
853871
CachingConnectionFactory connectionFactory = context.getBean(CachingConnectionFactory.class);
854872
return connectionFactory.getRabbitConnectionFactory();
@@ -1113,4 +1131,36 @@ ConnectionFactoryCustomizer firstCustomizer() {
11131131

11141132
}
11151133

1134+
@Configuration(proxyBeanMethods = false)
1135+
static class SimpleContainerCustomizerConfiguration {
1136+
1137+
boolean customizerCalled;
1138+
1139+
@RabbitListener(queues = "test", autoStartup = "false")
1140+
void listen(String in) {
1141+
}
1142+
1143+
@Bean
1144+
ContainerCustomizer<SimpleMessageListenerContainer> customizer() {
1145+
return (container) -> this.customizerCalled = true;
1146+
}
1147+
1148+
}
1149+
1150+
@Configuration(proxyBeanMethods = false)
1151+
static class DirectContainerCustomizerConfiguration {
1152+
1153+
boolean customizerCalled;
1154+
1155+
@RabbitListener(queues = "test", autoStartup = "false")
1156+
void listen(String in) {
1157+
}
1158+
1159+
@Bean
1160+
ContainerCustomizer<DirectMessageListenerContainer> customizer() {
1161+
return (container) -> this.customizerCalled = true;
1162+
}
1163+
1164+
}
1165+
11161166
}

0 commit comments

Comments
 (0)