Skip to content

Commit e236b71

Browse files
committed
Move RabbitMQ Simple listener support to dedicated namespace
Move `spring.rabbitmq.listener.*` to `spring.rabbitmq.listener.simple.*` in preparation for Spring AMQP 2.0 that supports different container types. Closes gh-9108 See gh-9055
1 parent 3d836f7 commit e236b71

File tree

5 files changed

+234
-34
lines changed

5 files changed

+234
-34
lines changed

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

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.springframework.amqp.core.AcknowledgeMode;
2323
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory.CacheMode;
2424
import org.springframework.boot.context.properties.ConfigurationProperties;
25+
import org.springframework.boot.context.properties.DeprecatedConfigurationProperty;
2526
import org.springframework.boot.context.properties.NestedConfigurationProperty;
2627
import org.springframework.util.CollectionUtils;
2728
import org.springframework.util.StringUtils;
@@ -466,6 +467,111 @@ public void setSize(Integer size) {
466467

467468
public static class Listener {
468469

470+
@NestedConfigurationProperty
471+
private final AmqpContainer simple = new AmqpContainer();
472+
473+
@DeprecatedConfigurationProperty(replacement = "spring.rabbitmq.listener.simple.auto-startup")
474+
@Deprecated
475+
public boolean isAutoStartup() {
476+
return getSimple().isAutoStartup();
477+
}
478+
479+
@Deprecated
480+
public void setAutoStartup(boolean autoStartup) {
481+
getSimple().setAutoStartup(autoStartup);
482+
}
483+
484+
@DeprecatedConfigurationProperty(replacement = "spring.rabbitmq.listener.simple.acknowledge-mode")
485+
@Deprecated
486+
public AcknowledgeMode getAcknowledgeMode() {
487+
return getSimple().getAcknowledgeMode();
488+
}
489+
490+
@Deprecated
491+
public void setAcknowledgeMode(AcknowledgeMode acknowledgeMode) {
492+
getSimple().setAcknowledgeMode(acknowledgeMode);
493+
}
494+
495+
@DeprecatedConfigurationProperty(replacement = "spring.rabbitmq.listener.simple.concurrency")
496+
@Deprecated
497+
public Integer getConcurrency() {
498+
return getSimple().getConcurrency();
499+
}
500+
501+
@Deprecated
502+
public void setConcurrency(Integer concurrency) {
503+
getSimple().setConcurrency(concurrency);
504+
}
505+
506+
@DeprecatedConfigurationProperty(replacement = "spring.rabbitmq.listener.simple.max-concurrency")
507+
@Deprecated
508+
public Integer getMaxConcurrency() {
509+
return getSimple().getMaxConcurrency();
510+
}
511+
512+
@Deprecated
513+
public void setMaxConcurrency(Integer maxConcurrency) {
514+
getSimple().setMaxConcurrency(maxConcurrency);
515+
}
516+
517+
@DeprecatedConfigurationProperty(replacement = "spring.rabbitmq.listener.simple.prefetch")
518+
@Deprecated
519+
public Integer getPrefetch() {
520+
return getSimple().getPrefetch();
521+
}
522+
523+
@Deprecated
524+
public void setPrefetch(Integer prefetch) {
525+
getSimple().setPrefetch(prefetch);
526+
}
527+
528+
@DeprecatedConfigurationProperty(replacement = "spring.rabbitmq.listener.simple.transaction-size")
529+
@Deprecated
530+
public Integer getTransactionSize() {
531+
return getSimple().getTransactionSize();
532+
}
533+
534+
@Deprecated
535+
public void setTransactionSize(Integer transactionSize) {
536+
getSimple().setTransactionSize(transactionSize);
537+
}
538+
539+
@DeprecatedConfigurationProperty(replacement = "spring.rabbitmq.listener.simple.default-requeue-rejected")
540+
@Deprecated
541+
public Boolean getDefaultRequeueRejected() {
542+
return getSimple().getDefaultRequeueRejected();
543+
}
544+
545+
@Deprecated
546+
public void setDefaultRequeueRejected(Boolean defaultRequeueRejected) {
547+
getSimple().setDefaultRequeueRejected(defaultRequeueRejected);
548+
}
549+
550+
@DeprecatedConfigurationProperty(replacement = "spring.rabbitmq.listener.simple.idle-event-interval")
551+
@Deprecated
552+
public Long getIdleEventInterval() {
553+
return getSimple().getIdleEventInterval();
554+
}
555+
556+
@Deprecated
557+
public void setIdleEventInterval(Long idleEventInterval) {
558+
getSimple().setIdleEventInterval(idleEventInterval);
559+
}
560+
561+
@DeprecatedConfigurationProperty(replacement = "spring.rabbitmq.listener.simple.retry")
562+
@Deprecated
563+
public ListenerRetry getRetry() {
564+
return getSimple().getRetry();
565+
}
566+
567+
public AmqpContainer getSimple() {
568+
return this.simple;
569+
}
570+
571+
}
572+
573+
public static class AmqpContainer {
574+
469575
/**
470576
* Start the container automatically on startup.
471577
*/

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

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -81,30 +81,31 @@ public void configure(SimpleRabbitListenerContainerFactory factory,
8181
if (this.messageConverter != null) {
8282
factory.setMessageConverter(this.messageConverter);
8383
}
84-
RabbitProperties.Listener listenerConfig = this.rabbitProperties.getListener();
85-
factory.setAutoStartup(listenerConfig.isAutoStartup());
86-
if (listenerConfig.getAcknowledgeMode() != null) {
87-
factory.setAcknowledgeMode(listenerConfig.getAcknowledgeMode());
84+
RabbitProperties.AmqpContainer config = this.rabbitProperties.getListener()
85+
.getSimple();
86+
factory.setAutoStartup(config.isAutoStartup());
87+
if (config.getAcknowledgeMode() != null) {
88+
factory.setAcknowledgeMode(config.getAcknowledgeMode());
8889
}
89-
if (listenerConfig.getConcurrency() != null) {
90-
factory.setConcurrentConsumers(listenerConfig.getConcurrency());
90+
if (config.getConcurrency() != null) {
91+
factory.setConcurrentConsumers(config.getConcurrency());
9192
}
92-
if (listenerConfig.getMaxConcurrency() != null) {
93-
factory.setMaxConcurrentConsumers(listenerConfig.getMaxConcurrency());
93+
if (config.getMaxConcurrency() != null) {
94+
factory.setMaxConcurrentConsumers(config.getMaxConcurrency());
9495
}
95-
if (listenerConfig.getPrefetch() != null) {
96-
factory.setPrefetchCount(listenerConfig.getPrefetch());
96+
if (config.getPrefetch() != null) {
97+
factory.setPrefetchCount(config.getPrefetch());
9798
}
98-
if (listenerConfig.getTransactionSize() != null) {
99-
factory.setTxSize(listenerConfig.getTransactionSize());
99+
if (config.getTransactionSize() != null) {
100+
factory.setTxSize(config.getTransactionSize());
100101
}
101-
if (listenerConfig.getDefaultRequeueRejected() != null) {
102-
factory.setDefaultRequeueRejected(listenerConfig.getDefaultRequeueRejected());
102+
if (config.getDefaultRequeueRejected() != null) {
103+
factory.setDefaultRequeueRejected(config.getDefaultRequeueRejected());
103104
}
104-
if (listenerConfig.getIdleEventInterval() != null) {
105-
factory.setIdleEventInterval(listenerConfig.getIdleEventInterval());
105+
if (config.getIdleEventInterval() != null) {
106+
factory.setIdleEventInterval(config.getIdleEventInterval());
106107
}
107-
ListenerRetry retryConfig = listenerConfig.getRetry();
108+
ListenerRetry retryConfig = config.getRetry();
108109
if (retryConfig.isEnabled()) {
109110
RetryInterceptorBuilder<?> builder = (retryConfig.isStateless()
110111
? RetryInterceptorBuilder.stateless()

spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,72 @@
351351
"description": "Create an AmqpAdmin bean.",
352352
"defaultValue": true
353353
},
354+
{
355+
"name": "spring.rabbitmq.listener.retry.enabled",
356+
"type": "java.lang.Boolean",
357+
"description": "Whether or not publishing retries are enabled.",
358+
"sourceType": "org.springframework.boot.autoconfigure.amqp.RabbitProperties$ListenerRetry",
359+
"defaultValue": false,
360+
"deprecated": true,
361+
"deprecation": {
362+
"replacement": "spring.rabbitmq.listener.simple.retry.enabled"
363+
}
364+
},
365+
{
366+
"name": "spring.rabbitmq.listener.retry.initial-interval",
367+
"type": "java.lang.Long",
368+
"description": "Interval between the first and second attempt to publish or deliver a message.",
369+
"sourceType": "org.springframework.boot.autoconfigure.amqp.RabbitProperties$ListenerRetry",
370+
"defaultValue": 1000,
371+
"deprecated": true,
372+
"deprecation": {
373+
"replacement": "spring.rabbitmq.listener.simple.retry.initial-interval"
374+
}
375+
},
376+
{
377+
"name": "spring.rabbitmq.listener.retry.max-attempts",
378+
"type": "java.lang.Integer",
379+
"description": "Maximum number of attempts to publish or deliver a message.",
380+
"sourceType": "org.springframework.boot.autoconfigure.amqp.RabbitProperties$ListenerRetry",
381+
"defaultValue": 3,
382+
"deprecated": true,
383+
"deprecation": {
384+
"replacement": "spring.rabbitmq.listener.simple.retry.max-attempts"
385+
}
386+
},
387+
{
388+
"name": "spring.rabbitmq.listener.retry.max-interval",
389+
"type": "java.lang.Long",
390+
"description": "Maximum interval between attempts.",
391+
"sourceType": "org.springframework.boot.autoconfigure.amqp.RabbitProperties$ListenerRetry",
392+
"defaultValue": 10000,
393+
"deprecated": true,
394+
"deprecation": {
395+
"replacement": "spring.rabbitmq.listener.simple.retry.max-interval"
396+
}
397+
},
398+
{
399+
"name": "spring.rabbitmq.listener.retry.multiplier",
400+
"type": "java.lang.Double",
401+
"description": "A multiplier to apply to the previous retry interval.",
402+
"sourceType": "org.springframework.boot.autoconfigure.amqp.RabbitProperties$ListenerRetry",
403+
"defaultValue": 1,
404+
"deprecated": true,
405+
"deprecation": {
406+
"replacement": "spring.rabbitmq.listener.simple.retry.multiplier"
407+
}
408+
},
409+
{
410+
"name": "spring.rabbitmq.listener.retry.stateless",
411+
"type": "java.lang.Boolean",
412+
"description": "Whether or not retries are stateless or stateful.",
413+
"sourceType": "org.springframework.boot.autoconfigure.amqp.RabbitProperties$ListenerRetry",
414+
"defaultValue": true,
415+
"deprecated": true,
416+
"deprecation": {
417+
"replacement": "spring.rabbitmq.listener.simple.retry.stateless"
418+
}
419+
},
354420
{
355421
"name": "spring.session.hazelcast.flush-mode",
356422
"defaultValue": "on-save"

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

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -293,9 +293,9 @@ public void testRabbitListenerContainerFactoryBackOff() {
293293
}
294294

295295
@Test
296-
public void testRabbitListenerContainerFactoryWithCustomSettings() {
297-
load(new Class<?>[] { MessageConvertersConfiguration.class,
298-
MessageRecoverersConfiguration.class },
296+
@Deprecated
297+
public void testSimpleRabbitListenerContainerFactoryWithCustomDeprecatedSettings() {
298+
testSimpleRabbitListenerContainerFactoryWithCustomSettings(
299299
"spring.rabbitmq.listener.retry.enabled:true",
300300
"spring.rabbitmq.listener.retry.maxAttempts:4",
301301
"spring.rabbitmq.listener.retry.initialInterval:2000",
@@ -309,10 +309,37 @@ public void testRabbitListenerContainerFactoryWithCustomSettings() {
309309
"spring.rabbitmq.listener.defaultRequeueRejected:false",
310310
"spring.rabbitmq.listener.idleEventInterval:5",
311311
"spring.rabbitmq.listener.transactionSize:20");
312+
}
313+
314+
@Test
315+
public void testSimpleRabbitListenerContainerFactoryWithCustomSettings() {
316+
testSimpleRabbitListenerContainerFactoryWithCustomSettings(
317+
"spring.rabbitmq.listener.simple.retry.enabled:true",
318+
"spring.rabbitmq.listener.simple.retry.maxAttempts:4",
319+
"spring.rabbitmq.listener.simple.retry.initialInterval:2000",
320+
"spring.rabbitmq.listener.simple.retry.multiplier:1.5",
321+
"spring.rabbitmq.listener.simple.retry.maxInterval:5000",
322+
"spring.rabbitmq.listener.simple.autoStartup:false",
323+
"spring.rabbitmq.listener.simple.acknowledgeMode:manual",
324+
"spring.rabbitmq.listener.simple.concurrency:5",
325+
"spring.rabbitmq.listener.simple.maxConcurrency:10",
326+
"spring.rabbitmq.listener.simple.prefetch:40",
327+
"spring.rabbitmq.listener.simple.defaultRequeueRejected:false",
328+
"spring.rabbitmq.listener.simple.idleEventInterval:5",
329+
"spring.rabbitmq.listener.simple.transactionSize:20");
330+
}
331+
332+
private void testSimpleRabbitListenerContainerFactoryWithCustomSettings(String... environment) {
333+
load(new Class<?>[] { MessageConvertersConfiguration.class,
334+
MessageRecoverersConfiguration.class }, environment);
312335
SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory = this.context
313336
.getBean("rabbitListenerContainerFactory",
314337
SimpleRabbitListenerContainerFactory.class);
315338
DirectFieldAccessor dfa = new DirectFieldAccessor(rabbitListenerContainerFactory);
339+
checkCommonProps(dfa);
340+
}
341+
342+
private void checkCommonProps(DirectFieldAccessor dfa) {
316343
assertThat(dfa.getPropertyValue("autoStartup")).isEqualTo(Boolean.FALSE);
317344
assertThat(dfa.getPropertyValue("acknowledgeMode"))
318345
.isEqualTo(AcknowledgeMode.MANUAL);

spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -936,20 +936,20 @@ content into your application; rather pick only the properties that you need.
936936
spring.rabbitmq.connection-timeout= # Connection timeout, in milliseconds; zero for infinite.
937937
spring.rabbitmq.dynamic=true # Create an AmqpAdmin bean.
938938
spring.rabbitmq.host=localhost # RabbitMQ host.
939-
spring.rabbitmq.listener.acknowledge-mode= # Acknowledge mode of container.
940-
spring.rabbitmq.listener.auto-startup=true # Start the container automatically on startup.
941-
spring.rabbitmq.listener.concurrency= # Minimum number of consumers.
942-
spring.rabbitmq.listener.default-requeue-rejected= # Whether or not to requeue delivery failures; default `true`.
943-
spring.rabbitmq.listener.idle-event-interval= # How often idle container events should be published in milliseconds.
944-
spring.rabbitmq.listener.max-concurrency= # Maximum number of consumers.
945-
spring.rabbitmq.listener.prefetch= # Number of messages to be handled in a single request. It should be greater than or equal to the transaction size (if used).
946-
spring.rabbitmq.listener.retry.enabled=false # Whether or not publishing retries are enabled.
947-
spring.rabbitmq.listener.retry.initial-interval=1000 # Interval between the first and second attempt to deliver a message.
948-
spring.rabbitmq.listener.retry.max-attempts=3 # Maximum number of attempts to deliver a message.
949-
spring.rabbitmq.listener.retry.max-interval=10000 # Maximum interval between attempts.
950-
spring.rabbitmq.listener.retry.multiplier=1.0 # A multiplier to apply to the previous delivery retry interval.
951-
spring.rabbitmq.listener.retry.stateless=true # Whether or not retry is stateless or stateful.
952-
spring.rabbitmq.listener.transaction-size= # Number of messages to be processed in a transaction. For best results it should be less than or equal to the prefetch count.
939+
spring.rabbitmq.listener.simple.acknowledge-mode= # Acknowledge mode of container.
940+
spring.rabbitmq.listener.simple.auto-startup=true # Start the container automatically on startup.
941+
spring.rabbitmq.listener.simple.concurrency= # Minimum number of consumers.
942+
spring.rabbitmq.listener.simple.default-requeue-rejected= # Whether or not to requeue delivery failures; default `true`.
943+
spring.rabbitmq.listener.simple.idle-event-interval= # How often idle container events should be published in milliseconds.
944+
spring.rabbitmq.listener.simple.max-concurrency= # Maximum number of consumers.
945+
spring.rabbitmq.listener.simple.prefetch= # Number of messages to be handled in a single request. It should be greater than or equal to the transaction size (if used).
946+
spring.rabbitmq.listener.simple.retry.enabled=false # Whether or not publishing retries are enabled.
947+
spring.rabbitmq.listener.simple.retry.initial-interval=1000 # Interval between the first and second attempt to deliver a message.
948+
spring.rabbitmq.listener.simple.retry.max-attempts=3 # Maximum number of attempts to deliver a message.
949+
spring.rabbitmq.listener.simple.retry.max-interval=10000 # Maximum interval between attempts.
950+
spring.rabbitmq.listener.simple.retry.multiplier=1.0 # A multiplier to apply to the previous delivery retry interval.
951+
spring.rabbitmq.listener.simple.retry.stateless=true # Whether or not retry is stateless or stateful.
952+
spring.rabbitmq.listener.simple.transaction-size= # Number of messages to be processed in a transaction. For best results it should be less than or equal to the prefetch count.
953953
spring.rabbitmq.password= # Login to authenticate against the broker.
954954
spring.rabbitmq.port=5672 # RabbitMQ port.
955955
spring.rabbitmq.publisher-confirms=false # Enable publisher confirms.

0 commit comments

Comments
 (0)