Подтвердить что ты не робот

Динамически добавлять новые очереди, привязки и обмены как beans

В настоящее время я работаю над проектом внедрения rabbit-amqp и использую spring -rabbit для программной настройки всех моих очередей, привязок и обменов. (spring -rabbit-1.3.4 и spring -framework версии 3.2.0)

Объявление в классе javaconfiguration или xml-конфигурации является, по моему мнению, довольно статичным. Я знаю, как установить более динамическое значение (например, имя) для очереди, обмен или связывание следующим образом:

@Configuration
public class serverConfiguration {
   private String queueName;
   ...
   @Bean
   public Queue buildQueue() {
    Queue queue = new Queue(this.queueName, false, false, true, getQueueArguments());
    buildRabbitAdmin().declareQueue(queue);
    return queue;
   }
   ...
}

Но мне было интересно, можно ли создать экземпляры экземпляра undefined Queue и зарегистрируйте их как beans как factory, регистрируя все его экземпляры.

Я не очень хорошо знаком с аннотацией Spring @Bean и ее ограничениями, но я пробовал

@Configuration
public class serverConfiguration {
   private String queueName;
   ...
   @Bean
   @Scope("prototype")
   public Queue buildQueue() {
    Queue queue = new Queue(this.queueName, false, false, true, getQueueArguments());
    buildRabbitAdmin().declareQueue(queue);
    return queue;
   }
   ...
}

И чтобы проверить, зарегистрированы ли несколько экземпляров очереди beans очереди, я вызываю:

Map<String, Queue> queueBeans = ((ListableBeanFactory) applicationContext).getBeansOfType(Queue.class);

Но это приведет только к отображению 1:

name of the method := the last created instance.

Можно ли динамически добавлять beans во время выполнения в SpringApplicationContext?

4b9b3361

Ответ 1

Динамически добавьте beans в контекст:

context.getBeanFactory().registerSingleton("foo", new Queue("foo"));

но они не будут объявлены администратором автоматически; вам придется вызвать admin.initialize(), чтобы заставить его повторно объявить все элементы AMQP в контексте.

Вы бы не сделали ни одного из них в @Bean s, просто нормальный код Java.