14

我目前正在开发一个 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;
   }
   ...
}

但我想知道是否可以创建未定义数量的 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?

4

1 回答 1

10

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

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

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

你不会在@Beans 中做这些,只是普通的运行时 java 代码。

于 2014-06-16T12:52:31.273 回答