diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/DirectRabbitListenerContainerFactoryConfigurer.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/DirectRabbitListenerContainerFactoryConfigurer.java index d3cd82b5300b..67c1fe9cea65 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/DirectRabbitListenerContainerFactoryConfigurer.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/DirectRabbitListenerContainerFactoryConfigurer.java @@ -40,6 +40,8 @@ public void configure(DirectRabbitListenerContainerFactory factory, configure(factory, connectionFactory, config); map.from(config::getConsumersPerQueue).whenNonNull() .to(factory::setConsumersPerQueue); + map.from(config::getMissingQueuesFatal).whenNonNull() + .to(factory::setMissingQueuesFatal); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java index 02292ebeccb1..dd592b045300 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitProperties.java @@ -639,6 +639,13 @@ public static class SimpleContainer extends AmqpContainer { */ private Integer transactionSize; + /** + * Whether the context should be ended up with failure if there are no any queues + * available on the broker or the container should be stopped if queues have been + * removed while the container is running. + */ + private Boolean missingQueuesFatal; + public Integer getConcurrency() { return this.concurrency; } @@ -663,6 +670,14 @@ public void setTransactionSize(Integer transactionSize) { this.transactionSize = transactionSize; } + public Boolean getMissingQueuesFatal() { + return this.missingQueuesFatal; + } + + public void setMissingQueuesFatal(Boolean missingQueuesFatal) { + this.missingQueuesFatal = missingQueuesFatal; + } + } /** @@ -675,6 +690,12 @@ public static class DirectContainer extends AmqpContainer { */ private Integer consumersPerQueue; + /** + * Whether the context should be ended up with failure if there are no any queues + * available on the broker. + */ + private Boolean missingQueuesFatal; + public Integer getConsumersPerQueue() { return this.consumersPerQueue; } @@ -683,6 +704,14 @@ public void setConsumersPerQueue(Integer consumersPerQueue) { this.consumersPerQueue = consumersPerQueue; } + public Boolean getMissingQueuesFatal() { + return this.missingQueuesFatal; + } + + public void setMissingQueuesFatal(Boolean missingQueuesFatal) { + this.missingQueuesFatal = missingQueuesFatal; + } + } public static class Template { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/SimpleRabbitListenerContainerFactoryConfigurer.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/SimpleRabbitListenerContainerFactoryConfigurer.java index 6321fab6090f..017722763cd9 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/SimpleRabbitListenerContainerFactoryConfigurer.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/SimpleRabbitListenerContainerFactoryConfigurer.java @@ -43,6 +43,8 @@ public void configure(SimpleRabbitListenerContainerFactory factory, map.from(config::getMaxConcurrency).whenNonNull() .to(factory::setMaxConcurrentConsumers); map.from(config::getTransactionSize).whenNonNull().to(factory::setTxSize); + map.from(config::getMissingQueuesFatal).whenNonNull() + .to(factory::setMissingQueuesFatal); } } 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 37ef790aabfb..2eaf32f60bff 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 @@ -464,6 +464,7 @@ public void testSimpleRabbitListenerContainerFactoryWithCustomSettings() { "spring.rabbitmq.listener.simple.maxConcurrency:10", "spring.rabbitmq.listener.simple.prefetch:40", "spring.rabbitmq.listener.simple.defaultRequeueRejected:false", + "spring.rabbitmq.listener.simple.missingQueuesFatal:false", "spring.rabbitmq.listener.simple.idleEventInterval:5", "spring.rabbitmq.listener.simple.transactionSize:20") .run((context) -> { @@ -496,6 +497,7 @@ public void testDirectRabbitListenerContainerFactoryWithCustomSettings() { "spring.rabbitmq.listener.direct.consumers-per-queue:5", "spring.rabbitmq.listener.direct.prefetch:40", "spring.rabbitmq.listener.direct.defaultRequeueRejected:false", + "spring.rabbitmq.listener.direct.missingQueuesFatal:false", "spring.rabbitmq.listener.direct.idleEventInterval:5") .run((context) -> { DirectRabbitListenerContainerFactory rabbitListenerContainerFactory = context @@ -617,6 +619,7 @@ private void checkCommonProps(AssertableApplicationContext context, assertThat(dfa.getPropertyValue("prefetchCount")).isEqualTo(40); assertThat(dfa.getPropertyValue("messageConverter")) .isSameAs(context.getBean("myMessageConverter")); + assertThat(dfa.getPropertyValue("missingQueuesFatal")).isEqualTo(false); assertThat(dfa.getPropertyValue("defaultRequeueRejected")) .isEqualTo(Boolean.FALSE); assertThat(dfa.getPropertyValue("idleEventInterval")).isEqualTo(5L); diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index 328ed881e6fe..d54264f3f305 100644 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -1138,6 +1138,7 @@ content into your application. Rather, pick only the properties that you need. spring.rabbitmq.listener.direct.consumers-per-queue= # Number of consumers per queue. spring.rabbitmq.listener.direct.default-requeue-rejected= # Whether rejected deliveries are re-queued by default. spring.rabbitmq.listener.direct.idle-event-interval= # How often idle container events should be published. + spring.rabbitmq.listener.direct.missing-queues-fatal= # Whether the context should be ended up with failure if there are no any queues available on the broker. spring.rabbitmq.listener.direct.prefetch= # Number of messages to be handled in a single request. It should be greater than or equal to the transaction size (if used). spring.rabbitmq.listener.direct.retry.enabled=false # Whether publishing retries are enabled. spring.rabbitmq.listener.direct.retry.initial-interval=1000ms # Duration between the first and second attempt to deliver a message. @@ -1151,6 +1152,7 @@ content into your application. Rather, pick only the properties that you need. spring.rabbitmq.listener.simple.default-requeue-rejected= # Whether rejected deliveries are re-queued by default. spring.rabbitmq.listener.simple.idle-event-interval= # How often idle container events should be published. spring.rabbitmq.listener.simple.max-concurrency= # Maximum number of listener invoker threads. + spring.rabbitmq.listener.simple.missing-queues-fatal= # Whether the context should be ended up with failure if there are no any queues available on the broker or the container should be stopped if queues have been removed while the container is running. 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). spring.rabbitmq.listener.simple.retry.enabled=false # Whether publishing retries are enabled. spring.rabbitmq.listener.simple.retry.initial-interval=1000ms # Duration between the first and second attempt to deliver a message.