在运行时向兔子侦听器动态添加队列
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 你能分享一下这方面的任何例子吗?这正是我们正在寻找的,但是我们想要一种混合方法,其中一些队列名称是预先知道的,一些新队列将在运行时发现。以上是关于在运行时向兔子侦听器动态添加队列的主要内容,如果未能解决你的问题,请参考以下文章