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

时间:2019-01-22 16:21:20

标签: java rabbitmq spring-amqp

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

我设法做到了“静态” 通过这样声明我的工厂:

        @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注释添加到我的侦听器类中,如下所示:

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

但是我希望能够在启动时通过加载诸如rabbit.host[i]之类的属性列表,然后将其动态添加到我的监听器中来创建连接工厂。

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

1 个答案:

答案 0 :(得分:1)

您不能使用静态的@RabbitListener注释,但是可以register listener endpoints programmatically

您可以使用此处所示的SimpleRabbitListenerEndpoint,如果要调用POJO方法(例如MethodRabbitListenerEndpoint,则可以使用@RabbitListener

您可以使用重载的registerEndpoint方法来连接适当的工厂。