Java 在运行时向rabbit侦听器动态添加队列
我有一个项目,我们将在rabbit中有数百(可能数千)个队列,每个队列都需要由一组消费者使用 在rabbit中(使用spring amqp),您有rabbitlistener注释,它允许我静态地分配这个特定消费者将处理的队列 我的问题是——对于rabbit和spring,是否有一种干净的方法可以让我抓取一部分队列(比如以a-c开头的队列),然后监听消费者运行时创建的任何队列 示例(开始时):Java 在运行时向rabbit侦听器动态添加队列,java,rabbitmq,spring-amqp,Java,Rabbitmq,Spring Amqp,我有一个项目,我们将在rabbit中有数百(可能数千)个队列,每个队列都需要由一组消费者使用 在rabbit中(使用spring amqp),您有rabbitlistener注释,它允许我静态地分配这个特定消费者将处理的队列 我的问题是——对于rabbit和spring,是否有一种干净的方法可以让我抓取一部分队列(比如以a-c开头的队列),然后监听消费者运行时创建的任何队列 示例(开始时): 蚂蚁队 苹果排队 猫队 当消费者正在运行时: 添加bat队列 以下是我目前拥有的(非常简单)代码
- 蚂蚁队
- 苹果排队
- 猫队
- 添加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文档,除了静态(硬编码或通过属性)声明队列之外,我没有发现任何东西- 注入(
或其他方式)RabbitListenerEndpointRegistry@Autowired
- 获取对侦听器容器的引用(使用注释上的
属性为其提供一个已知id)(id
)registry.getListenerContainer(id)
- 将容器强制转换为
并调用AbstractMessageListenerContainer
或addQueues()
addQueueNames()
请注意,在动态添加队列时,使用
DirectMessageListenerContainer
更有效;使用SimpleMessageListenerContainer
停止并重新启动使用者。使用direct容器,每个队列都有自己的使用者
请参阅。“使用direct容器,每个队列都有自己的消费者”-音乐让我耳目一新。谢谢你的信息!加里——我错了。是否可以基于特定的命名约定异步确定rabbitmq服务器中存在的队列?理论上,我们需要每秒进行一次调查,以确定存在哪些队列,并为其创建一个消费者。不要在对旧答案的评论中提出新问题,这对其他人搜索答案没有帮助;改为问一个新问题。AMQP协议中没有这样做的内容;RabbitMQ确实提供了一个RESTAPI(和一个),但我认为轮询(尤其是以这种速率)不是一个好主意。考虑将消费者添加到绑定到该队列的队列;您可以获得
队列。已创建的事件。感谢Gary-对中的问题表示歉意comment@GaryRussell你能给我举个例子吗。这正是我们正在寻找的,但是我们需要一种混合方法,其中一些队列名称是预先知道的,一些新的队列将在运行时被发现。