GH-734: Option to suppress declaring Collections

Fixes https://github.com/spring-projects/spring-amqp/issues/734

Add `declareCollections` flag to admin (default false).

(cherry picked from commit 5423233)
This commit is contained in:
Gary Russell
2018-03-30 16:41:10 -04:00
committed by Artem Bilan
parent d6a5a7555b
commit 539af7f1f0
3 changed files with 45 additions and 2 deletions

View File

@@ -19,6 +19,7 @@ package org.springframework.amqp.rabbit.core;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
@@ -110,6 +111,8 @@ public class RabbitAdmin implements AmqpAdmin, ApplicationContextAware, Applicat
private ApplicationEventPublisher applicationEventPublisher;
private boolean declareCollections = true;
private volatile DeclarationExceptionEvent lastDeclarationExceptionEvent;
public RabbitAdmin(ConnectionFactory connectionFactory) {
@@ -136,6 +139,17 @@ public class RabbitAdmin implements AmqpAdmin, ApplicationContextAware, Applicat
this.ignoreDeclarationExceptions = ignoreDeclarationExceptions;
}
/**
* Set to false to disable declaring collections of {@link Declarable}.
* Since the admin has to iterate over all Collection beans, this may
* cause undesirable side-effects in some cases. Default true.
* @param declareCollections set to false to prevent declarations of collections.
* @since 1.7.7
*/
public void setDeclareCollections(boolean declareCollections) {
this.declareCollections = declareCollections;
}
/**
* @return the last {@link DeclarationExceptionEvent} that was detected in this admin.
*
@@ -438,6 +452,7 @@ public class RabbitAdmin implements AmqpAdmin, ApplicationContextAware, Applicat
* Declares all the exchanges, queues and bindings in the enclosing application context, if any. It should be safe
* (but unnecessary) to call this method more than once.
*/
@Override
public void initialize() {
if (this.applicationContext == null) {
@@ -454,8 +469,9 @@ public class RabbitAdmin implements AmqpAdmin, ApplicationContextAware, Applicat
this.applicationContext.getBeansOfType(Binding.class).values());
@SuppressWarnings("rawtypes")
Collection<Collection> collections = this.applicationContext.getBeansOfType(Collection.class, false, false)
.values();
Collection<Collection> collections = this.declareCollections
? this.applicationContext.getBeansOfType(Collection.class, false, false).values()
: Collections.emptyList();
for (Collection<?> collection : collections) {
if (collection.size() > 0 && collection.iterator().next() instanceof Declarable) {
for (Object declarable : collection) {

View File

@@ -250,6 +250,19 @@ public class RabbitAdminTests {
ctx.close();
}
@Test
public void testMultiEntitiesSuppressed() {
ConfigurableApplicationContext ctx = new AnnotationConfigApplicationContext(Config1.class);
RabbitAdmin admin = ctx.getBean(RabbitAdmin.class);
assertNotNull(admin.getQueueProperties("q1"));
assertNull(admin.getQueueProperties("q2"));
assertNull(admin.getQueueProperties("q3"));
assertNull(admin.getQueueProperties("q4"));
admin.deleteQueue("q1");
admin.deleteExchange("e1");
ctx.close();
}
@Test
public void testAvoidHangAMQP_508() {
CachingConnectionFactory cf = new CachingConnectionFactory("localhost");
@@ -376,6 +389,18 @@ public class RabbitAdminTests {
}
@Configuration
public static class Config1 extends Config {
@Override
public RabbitAdmin admin(ConnectionFactory cf) {
RabbitAdmin admin = super.admin(cf);
admin.setDeclareCollections(false);
return admin;
}
}
private static final class EventPublisher implements ApplicationEventPublisher {
private final List<DeclarationExceptionEvent> events;

View File

@@ -3309,6 +3309,8 @@ public static class Config {
}
-----
IMPORTANT: This feature can cause undesirable side effects in some cases, because the admin has to iterate over all `Collection<?>` beans.
Starting with _versions 1.7.7, 2.0.4_, this feature can be disabled by setting the admin property `declareCollections` to `false`.
[[conditional-declaration]]
===== Conditional Declaration