Java 在运行时向rabbit侦听器动态添加队列

Java 在运行时向rabbit侦听器动态添加队列,java,rabbitmq,spring-amqp,Java,Rabbitmq,Spring Amqp,我有一个项目,我们将在rabbit中有数百(可能数千)个队列,每个队列都需要由一组消费者使用 在rabbit中(使用spring amqp),您有rabbitlistener注释,它允许我静态地分配这个特定消费者将处理的队列 我的问题是——对于rabbit和spring,是否有一种干净的方法可以让我抓取一部分队列(比如以a-c开头的队列),然后监听消费者运行时创建的任何队列 示例(开始时): 蚂蚁队 苹果排队 猫队 当消费者正在运行时: 添加bat队列 以下是我目前拥有的(非常简单)代码

我有一个项目,我们将在rabbit中有数百(可能数千)个队列,每个队列都需要由一组消费者使用

在rabbit中(使用spring amqp),您有rabbitlistener注释,它允许我静态地分配这个特定消费者将处理的队列

我的问题是——对于rabbit和spring,是否有一种干净的方法可以让我抓取一部分队列(比如以a-c开头的队列),然后监听消费者运行时创建的任何队列

示例(开始时):

  • 蚂蚁队
  • 苹果排队
  • 猫队
当消费者正在运行时:

  • 添加bat队列
以下是我目前拥有的(非常简单)代码:

    @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 ? >
        }
    }
@组件
公共类消息消费者{
公共信息消费者(){
//理想情况下,在这里获取一部分队列,初始化一个参数并将其提供给rabbitlistener注释
}
@RabbitListener(队列={“ant队列”、“apple队列”、“cat队列”})
public void processQueues(字符串messageAsJson){
<如何更新上面rabbit listener中声明的队列?>
}
}
编辑:

我应该补充一点——我已经浏览了我在网上找到的spring amqp文档,除了静态(硬编码或通过属性)声明队列之外,我没有发现任何东西

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

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

  • 将容器强制转换为
    AbstractMessageListenerContainer
    并调用
    addQueues()
    addQueueNames()


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


请参阅。

“使用direct容器,每个队列都有自己的消费者”-音乐让我耳目一新。谢谢你的信息!加里——我错了。是否可以基于特定的命名约定异步确定rabbitmq服务器中存在的队列?理论上,我们需要每秒进行一次调查,以确定存在哪些队列,并为其创建一个消费者。不要在对旧答案的评论中提出新问题,这对其他人搜索答案没有帮助;改为问一个新问题。AMQP协议中没有这样做的内容;RabbitMQ确实提供了一个RESTAPI(和一个),但我认为轮询(尤其是以这种速率)不是一个好主意。考虑将消费者添加到绑定到该队列的队列;您可以获得
队列。已创建的
事件。感谢Gary-对中的问题表示歉意comment@GaryRussell你能给我举个例子吗。这正是我们正在寻找的,但是我们需要一种混合方法,其中一些队列名称是预先知道的,一些新的队列将在运行时被发现。