From 343aac8e29bc1f085e6fa1163560a1d91ef169fa Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Fri, 15 Apr 2016 15:12:58 -0400 Subject: [PATCH] AMQP-598: Admin: Ignore Scoped and Prototype Beans JIRA: https://jira.spring.io/browse/AMQP-598 When looking for `Collection` using `getBeansOfType()` ignore prototype/scoped beans and do not initialize FBs. --- .../amqp/rabbit/core/RabbitAdmin.java | 12 ++++++++---- .../amqp/rabbit/core/RabbitAdminTests.java | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/core/RabbitAdmin.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/core/RabbitAdmin.java index b38c72e2dd..1232b9bed4 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/core/RabbitAdmin.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/core/RabbitAdmin.java @@ -448,12 +448,16 @@ public void initialize() { } this.logger.debug("Initializing declarations"); - Collection contextExchanges = new LinkedList(this.applicationContext.getBeansOfType(Exchange.class).values()); - Collection contextQueues = new LinkedList(this.applicationContext.getBeansOfType(Queue.class).values()); - Collection contextBindings = new LinkedList(this.applicationContext.getBeansOfType(Binding.class).values()); + Collection contextExchanges = new LinkedList( + this.applicationContext.getBeansOfType(Exchange.class).values()); + Collection contextQueues = new LinkedList( + this.applicationContext.getBeansOfType(Queue.class).values()); + Collection contextBindings = new LinkedList( + this.applicationContext.getBeansOfType(Binding.class).values()); @SuppressWarnings("rawtypes") - Collection collections = this.applicationContext.getBeansOfType(Collection.class).values(); + Collection collections = this.applicationContext.getBeansOfType(Collection.class, false, false) + .values(); for (Collection collection : collections) { if (collection.size() > 0 && collection.iterator().next() instanceof Declarable) { for (Object declarable : collection) { diff --git a/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/core/RabbitAdminTests.java b/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/core/RabbitAdminTests.java index 1b026287c8..486b69af21 100644 --- a/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/core/RabbitAdminTests.java +++ b/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/core/RabbitAdminTests.java @@ -44,6 +44,7 @@ import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeoutException; @@ -69,6 +70,7 @@ import org.springframework.amqp.rabbit.test.BrokerRunning; import org.springframework.amqp.utils.test.TestUtils; import org.springframework.beans.DirectFieldAccessor; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEventPublisher; @@ -76,6 +78,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; import org.springframework.context.support.GenericApplicationContext; import com.rabbitmq.client.Channel; @@ -243,6 +246,7 @@ public void testMultiEntities() { admin.deleteExchange("e2"); admin.deleteExchange("e3"); admin.deleteExchange("e4"); + assertNull(admin.getQueueProperties(ctx.getBean(Config.class).protypeQueueName)); ctx.close(); } @@ -297,6 +301,8 @@ public void testIgnoreDeclarationExeptionsTimeout() throws Exception { @Configuration public static class Config { + public String protypeQueueName = UUID.randomUUID().toString(); + @Bean public ConnectionFactory cf() { return new CachingConnectionFactory("localhost"); @@ -343,6 +349,14 @@ public List qs() { ); } + @Bean + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public List prototypes() { + return Arrays.asList( + new Queue(this.protypeQueueName, false, false, true) + ); + } + @Bean public List bs() { return Arrays.asList(