From e2485e3290b599582dbb11bddfc128a921ee6bef Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Wed, 27 Jan 2016 14:32:52 -0500 Subject: [PATCH] Clean Up Auto-Declare Context on Unbind --- .../rabbit/RabbitMessageChannelBinder.java | 33 +++++++++++++------ .../binder/rabbit/RabbitBinderTests.java | 10 +++++- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/spring-cloud-stream-binders/spring-cloud-stream-binder-rabbit/src/main/java/org/springframework/cloud/stream/binder/rabbit/RabbitMessageChannelBinder.java b/spring-cloud-stream-binders/spring-cloud-stream-binder-rabbit/src/main/java/org/springframework/cloud/stream/binder/rabbit/RabbitMessageChannelBinder.java index 7cd952f3c..8596fe07e 100644 --- a/spring-cloud-stream-binders/spring-cloud-stream-binder-rabbit/src/main/java/org/springframework/cloud/stream/binder/rabbit/RabbitMessageChannelBinder.java +++ b/spring-cloud-stream-binders/spring-cloud-stream-binder-rabbit/src/main/java/org/springframework/cloud/stream/binder/rabbit/RabbitMessageChannelBinder.java @@ -26,9 +26,6 @@ import java.util.Map; import java.util.Properties; import java.util.Set; -import com.rabbitmq.client.AMQP; -import com.rabbitmq.client.Channel; -import com.rabbitmq.client.Envelope; import org.aopalliance.aop.Advice; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -96,6 +93,10 @@ import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; +import com.rabbitmq.client.AMQP; +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Envelope; + /** * A {@link org.springframework.cloud.stream.binder.Binder} implementation backed by RabbitMQ. * @@ -716,7 +717,7 @@ public class RabbitMessageChannelBinder extends MessageChannelBinderSupport impl @Override protected void afterUnbind(Binding binding) { if (Binding.Type.consumer.equals(binding.getType())) { - cleanAutoDeclareContext(binding.getName()); + cleanAutoDeclareContext(binding); } } @@ -728,13 +729,25 @@ public class RabbitMessageChannelBinder extends MessageChannelBinderSupport impl } } - private void cleanAutoDeclareContext(String name) { + private void cleanAutoDeclareContext(Binding binding) { + Assert.isTrue(binding.getPropertiesAccessor() instanceof RabbitPropertiesAccessor, + "Binding was not created by this binder"); + String prefix = ((RabbitPropertiesAccessor) binding.getPropertiesAccessor()).getPrefix(this.defaultPrefix); + String name = binding.getName(); synchronized(this.autoDeclareContext) { - if (this.autoDeclareContext.containsBean(name)) { - ConfigurableListableBeanFactory beanFactory = this.autoDeclareContext.getBeanFactory(); - if (beanFactory instanceof DefaultListableBeanFactory) { - ((DefaultListableBeanFactory) beanFactory).destroySingleton(name); - } + removeSingleton(applyPrefix(prefix,name) + ".binding"); + removeSingleton(applyPrefix(prefix,name)); + String dlq = applyPrefix(prefix,name) + ".dlq"; + removeSingleton(dlq + ".binding"); + removeSingleton(dlq); + } + } + + private void removeSingleton(String name) { + if (this.autoDeclareContext.containsBean(name)) { + ConfigurableListableBeanFactory beanFactory = this.autoDeclareContext.getBeanFactory(); + if (beanFactory instanceof DefaultListableBeanFactory) { + ((DefaultListableBeanFactory) beanFactory).destroySingleton(name); } } } diff --git a/spring-cloud-stream-binders/spring-cloud-stream-binder-rabbit/src/test/java/org/springframework/cloud/stream/binder/rabbit/RabbitBinderTests.java b/spring-cloud-stream-binders/spring-cloud-stream-binder-rabbit/src/test/java/org/springframework/cloud/stream/binder/rabbit/RabbitBinderTests.java index c3cb521b6..8d95e7f5d 100644 --- a/spring-cloud-stream-binders/spring-cloud-stream-binder-rabbit/src/test/java/org/springframework/cloud/stream/binder/rabbit/RabbitBinderTests.java +++ b/spring-cloud-stream-binders/spring-cloud-stream-binder-rabbit/src/test/java/org/springframework/cloud/stream/binder/rabbit/RabbitBinderTests.java @@ -62,6 +62,7 @@ import org.springframework.cloud.stream.binder.Binding; import org.springframework.cloud.stream.binder.PartitionCapableBinderTests; import org.springframework.cloud.stream.binder.Spy; import org.springframework.cloud.stream.test.junit.rabbit.RabbitTestSupport; +import org.springframework.context.ApplicationContext; import org.springframework.expression.spel.standard.SpelExpression; import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.channel.QueueChannel; @@ -330,6 +331,13 @@ public class RabbitBinderTests extends PartitionCapableBinderTests { assertTrue(n < 100); binder.unbind(consumerBinding); + + ApplicationContext context = TestUtils.getPropertyValue(binder, "binder.autoDeclareContext", + ApplicationContext.class); + assertFalse(context.containsBean(TEST_PREFIX + "dlqtest.default.binding")); + assertFalse(context.containsBean(TEST_PREFIX + "dlqtest.default")); + assertFalse(context.containsBean(TEST_PREFIX + "dlqtest.default.dlq.binding")); + assertFalse(context.containsBean(TEST_PREFIX + "dlqtest.default.dlq")); } @Test @@ -702,7 +710,7 @@ public class RabbitBinderTests extends PartitionCapableBinderTests { binder.unbind(pubSubProducerBinding); binder.unbind(nonDurableConsumerBinding); binder.unbind(durableConsumerBinding); - + binder.cleanup(); proxy.stop();