From 8cb49f5932344fab3b4ededed949e3d6c0401d17 Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Thu, 17 Aug 2017 15:18:22 -0400 Subject: [PATCH] GH-75: Don't Ignore User Config Errors Resolves https://github.com/spring-cloud/spring-cloud-stream-binder-rabbit/issues/75 Instead of setting `ignoreDeclarationExceptions` in the provisioner's `RabbitAdmin`, catch the exception in the provisioner. Use a `DeclarationExceptionEvent` to determine that the exception was thrown in some other admin and treat the condition as fatal. --- .../RabbitExchangeQueueProvisioner.java | 42 +++++++++++++++++-- .../binder/rabbit/RabbitBinderTests.java | 42 +++++++++++++++++++ 2 files changed, 81 insertions(+), 3 deletions(-) diff --git a/spring-cloud-stream-binder-rabbit-core/src/main/java/org/springframework/cloud/stream/binder/rabbit/provisioning/RabbitExchangeQueueProvisioner.java b/spring-cloud-stream-binder-rabbit-core/src/main/java/org/springframework/cloud/stream/binder/rabbit/provisioning/RabbitExchangeQueueProvisioner.java index 63f5b8d21..e964b5229 100644 --- a/spring-cloud-stream-binder-rabbit-core/src/main/java/org/springframework/cloud/stream/binder/rabbit/provisioning/RabbitExchangeQueueProvisioner.java +++ b/spring-cloud-stream-binder-rabbit-core/src/main/java/org/springframework/cloud/stream/binder/rabbit/provisioning/RabbitExchangeQueueProvisioner.java @@ -33,6 +33,7 @@ import org.springframework.amqp.core.FanoutExchange; import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.TopicExchange; import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.DeclarationExceptionEvent; import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory; @@ -45,6 +46,7 @@ import org.springframework.cloud.stream.provisioning.ConsumerDestination; import org.springframework.cloud.stream.provisioning.ProducerDestination; import org.springframework.cloud.stream.provisioning.ProvisioningException; import org.springframework.cloud.stream.provisioning.ProvisioningProvider; +import org.springframework.context.ApplicationListener; import org.springframework.context.support.GenericApplicationContext; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -55,8 +57,9 @@ import org.springframework.util.StringUtils; * @author Soby Chacko * @author Gary Russell */ -public class RabbitExchangeQueueProvisioner implements ProvisioningProvider, - ExtendedProducerProperties> { +public class RabbitExchangeQueueProvisioner implements ApplicationListener, + ProvisioningProvider, + ExtendedProducerProperties> { private static final AnonymousQueue.Base64UrlNamingStrategy ANONYMOUS_GROUP_NAME_GENERATOR = new AnonymousQueue.Base64UrlNamingStrategy("anonymous."); @@ -71,13 +74,14 @@ public class RabbitExchangeQueueProvisioner implements ProvisioningProvider binding = null; + try { + binding = binder.bindConsumer("input", "baddecls", new DirectChannel(), createConsumerProperties()); + fail("Expected exception"); + } + catch (BinderException e) { + assertThat(e.getCause()).isInstanceOf(AmqpIOException.class); + } + finally { + admin.deleteQueue("testBadUserDeclarationsFatal"); + if (binding != null) { + binding.unbind(); + } + } + } + private SimpleMessageListenerContainer verifyContainer(Lifecycle endpoint) { SimpleMessageListenerContainer container; RetryTemplate retry;