以bean的形式动态添加新队列,绑定和交换

时间:2014-06-16 10:44:12

标签: spring spring-amqp spring-bean spring-rabbit

我目前正在开发一个rabbit-amqp实现项目,并使用spring-rabbit以编程方式设置我的所有队列,绑定和交换。 (spring-rabbit-1.3.4和spring-framework version 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;
   }
   ...
}

但是我想知道是否有可能创建一个未定义的Queue和 将它们注册为bean,就像注册其所有实例的工厂一样。

我不太熟悉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;
   }
   ...
}

要查看Queue的多个Bean实例是否已注册,我调用:

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

但这只会返回1个映射:

name of the method := the last created instance.

是否可以在运行时将bean动态添加到SpringApplicationContext?

1 个答案:

答案 0 :(得分:7)

您可以动态地将bean添加到上下文中:

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

但他们不会被管理员自动声明;你必须调用admin.initialize()强制它重新声明上下文中的所有AMQP元素。

你不会在@Bean中执行其中任何一个,只需要正常的运行时java代码。