我正在尝试使用@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])然后将其动态添加到我的监听器中来创建连接工厂。

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

最佳答案

您不能使用静态@RabbitListener注释来做到这一点,但是可以register listener endpoints programmatically

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

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

10-08 07:04