如何动态添加新队列(来自不同主机)到@RabitListener?

How to dynamically add new queues (from different hosts) to @RabitListener?

我正在尝试让@RabbitListener 监听来自从属性加载的不同主机的多个队列。队列相同,需要相同的消息处理。

我做到了"statically" 通过这样声明我的工厂:

        @Bean
        public ConnectionFactory defaultConnectionFactory() {
          CachingConnectionFactory cf = new CachingConnectionFactory();
          cf.setAddresses(hosts);
          cf.setPort(port);
          cf.setUsername(username);
          cf.setPassword(password);
          cf.setConnectionLimit(10000);
     cf.getRabbitConnectionFactory().setConnectionTimeout(connectionTimeout);
        return cf;
    }

    @Bean
    public SimpleRabbitListenerContainerFactory connectionFactory2() {
        SimpleRabbitListenerContainerFactory sf = new SimpleRabbitListenerContainerFactory();
        CachingConnectionFactory cf = new CachingConnectionFactory();
        cf.setAddresses(host2);
        cf.setPort(port2);
        cf.setUsername(username2);
        cf.setPassword(password2);
        cf.setConnectionLimit(connectionLimit);
        cf.getRabbitConnectionFactory().setConnectionTimeout(connectionTimeout);
        sf.setConnectionFactory(cf);
        return sf;
    }

然后将@RabbitListener 注释添加到我的侦听器class,如下所示:

@RabbitListener (queues = "q1")
@RabbitListener (queues = "q2" , containerFactory = "connectionFactory2")
public class RabbitListener {

但我希望能够在启动时通过加载一些 属性 列表(如 rabbit.host[i] 然后动态地将其添加到我的侦听器来创建连接工厂。

这样的事情可能吗?此用例的最佳实践是什么?

你不能用静态 @RabbitListener 注释来做,但你可以 register listener endpoints programmatically.

您可以使用此处所示的 SimpleRabbitListenerEndpoint,或者如果您想调用 POJO 方法(如 @RabbitListener.

,则可以使用 MethodRabbitListenerEndpoint

您可以在重载的 registerEndpoint 方法中连接适当的工厂。