在运行时向兔子侦听器动态添加队列

Posted

技术标签:

【中文标题】在运行时向兔子侦听器动态添加队列【英文标题】:Dynamic addition of queues to a rabbit listener at runtime 【发布时间】:2019-06-03 08:01:17 【问题描述】:

我有一个项目,我们将在 rabbit 中有数百个(可能是数千个)队列,每个队列都需要被一个消费者池消费。

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

我的问题是 - 使用 rabbit 和 spring,我是否有一种干净的方式来获取一部分队列(比如说以 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】:

注入(@Autowired 或其他)RabbitListenerEndpointRegistry

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

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

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

见Choosing a container。

【讨论】:

“使用直接容器,每个队列都有自己的消费者” - 音乐在我耳边。谢谢你的信息! 加里——我的错。是否可以根据某种命名约定异步确定 rabbitmq 服务器中存在的队列?理论上,我们需要每秒轮询一次以确定存在哪些队列并为其创建消费者。 不要在 cmets 中对旧答案提出新问题,它不会帮助其他人搜索答案;而是问一个新问题。 AMQP 协议中没有任何东西可以做到这一点。 RabbitMQ 确实提供了一个 REST API(和一个java binding for it),但我建议轮询(尤其是在那个速率下)不是一个好主意。考虑为绑定到event exchange 的队列添加消费者;你可以得到queue.created事件。 感谢 Gary - 为评论中的问题道歉 @GaryRussell 你能分享一下这方面的任何例子吗?这正是我们正在寻找的,但是我们想要一种混合方法,其中一些队列名称是预先知道的,一些新队列将在运行时发现。

以上是关于在运行时向兔子侦听器动态添加队列的主要内容,如果未能解决你的问题,请参考以下文章

使用 for 循环时向 JButton 添加操作

将选项卡动态添加到 actionscript TabBar

在动态创建的元素上添加事件监听器

添加动态数量的监听器(Spring JMS)

在 Java 中运行时添加骆驼路线

如何将事件侦听器添加到动态创建的复选框并检查是不是选中了复选框。 JavaScript