在运行时将队列动态添加到Rabbit侦听器

时间:2019-01-08 15:32:05

标签: java rabbitmq spring-amqp

我有一个项目,我们将在兔子中有数百个(可能是数千个)队列,并且这些队列中的每个队列都需要由一组消费者使用。

在Rabbit(使用spring-amqp)中,您具有rabbitlistener批注,该批注使我可以静态分配该特定消费者将要处理的队列。

我的问题是-对于兔子和春天,有没有一种干净的方法可以让我抓取一部分队列(比如说以ac开头的队列),然后侦听使用者运行时创建的任何队列。

示例(开始时):

  • 蚂蚁队列
  • 苹果队列
  • 猫排队

使用者运行时:

  • 添加蝙蝠队列

这是我目前拥有的(非常简单的)代码:

    @Component
    public class MessageConsumer {

        public MessageConsumer() {
            // ideally grab a section of queues here, initialize a parameter and give to the rabbitlistener annotation
        }

        @RabbitListener(queues= {"ant-queue", "apple-queue", "cat-queue"})
        public void processQueues(String messageAsJson) {
            < how do I update the queues declared in rabbit listener above ? >
        }
    }

编辑:

我应该添加-我已经遍历了我在网上找到的spring amqp文档,但是除了静态地(无论是通过硬编码还是通过属性)声明队列之外,没有发现任何东西

1 个答案:

答案 0 :(得分:1)

  • 注入(@Autowired或其他方式)RabbitListenerEndpointRegistry

  • 获取对侦听器容器的引用(使用注释上的id属性为它提供一个已知ID)(registry.getListenerContainer(id))。

  • 将容器投射到AbstractMessageListenerContainer并调用addQueues()addQueueNames()

请注意,在动态添加队列时使用DirectMessageListenerContainer更为有效;使用SimpleMessageListenerContainer的使用者将停止并重新启动。使用直接容器,每个队列都有自己的使用者。

请参见Choosing a container