当前位置: 首页 > 知识库问答 >
问题:

如何为RabbitMQ和Spring动态注册队列及其独占使用者/侦听器?

齐鹏程
2023-03-14

我有以下问题需要解决:我正在尝试使用RabbitMQ消息实现一个简单的延迟重试机制。我有一个基础设施,可以延迟传递消息。我可以让任何数量的感兴趣的参与者在运行时利用这种延迟重试机制。

参与者只想向我提供2个细节和信息:1。他们希望消息在延迟T秒后传递到的队列名称。2、队列的使用者(例如消息的使用者)

我已尝试执行以下操作:

private void startSeparateListener(final Object messageConsumer, 
                                   final Queue queue) {
        SimpleMessageListenerContainer simpleMessageListenerContainer 
                    = myCustomeSimpleMessageListenerFactory.create();
        simpleMessageListenerContainer.setRabbitAdmin(rabbitAdmin);
        simpleMessageListenerContainer.setQueues(queue);
        simpleMessageListenerContainer.setMessageListener(new MessageListenerAdapter(messageConsumer));
        simpleMessageListenerContainer.start();

    }

请注意,队列已经创建并注册到rabbitadmin,并且对象使用者有一个名为handleMessage的方法来侦听队列。

这是在运行时向队列的消息使用者动态注册队列的正确方法吗?

注意:Spring已经提供了一个SimpleMessageListenerContainer类型的bean,但是使用bean动态添加队列和消费者会导致Q1的非预期消费者被调用为另一个队列的接收者的一部分,例如Q2,其内容类型可能与Q1相同?

我试着搜索了很多,但是没有得到任何具体的解释。如果这是一个重复的问题,对于任何天真,请事先道歉。

共有1个答案

端木令雪
2023-03-14

我无法以某种方式编译您的问题,但我可以告诉您,RabbitMQ中已经有交易的Exchange解决方案,Sring AMQP很好地支持它。

我建议不要使用动态添加的SimpleMessageListenerContainer:这并不像看起来那么简单。有一个类似于addQueueNames()的选项:

/**
 * Add queue(s) to this container's list of queues. The existing consumers
 * will be cancelled after they have processed any pre-fetched messages and
 * new consumers will be created. The queue must exist to avoid problems when
 * restarting the consumers.
 * @param queueName The queue to add.
 */
@Override
public void addQueueNames(String... queueName) {

因此,您可以考虑不添加新容器,而是向现有容器添加新队列。amqp\U consumerQueue的下游路由可能有助于区分来自不同队列的消息。

 类似资料:
  • 我有一个rabbitListener,它连续异步地侦听队列“用户消息”的用户消息。除非队列中加载了大量消息,否则一切都正常。当消息批量发布到队列时,同一用户的消息首先被处理,从而其他用户的消息等待轮到他们。 我无法使用优先级队列,因为所有用户的优先级都相同。所以我想创建新的队列,并在运行时监听它们。一旦消息被使用,所有队列都将是短暂的。(队列将被删除) 在浏览时,我发现可以使用RabbitAdmi

  • 我正在尝试使用spring cloud AWS注释驱动的队列侦听器编写一个使用AWS SQS的web应用程序,下面是我的代码的样子: XML AWS bean: 然后我编写了这个类,它有一个带有SqsListener anotation的方法,它将hello打印到控制台: 这是我的gradle构建文件: 但是当我运行这个应用程序的时候,我对java和spring boot是个新手,有没有做错什么

  • 我刚接触Spring boot,我正在玩弄它。目前,我已经构建了一些应用程序,希望能够通过队列相互通信。我目前有一个侦听器对象,可以从特定队列接收消息。 这有效。但是,现在我希望能够监听另一个队列。所以我想我会复制上面的对象并更改队列名称。不幸的是,这不起作用,因为Spring Boot只为其中一个创建连接。关于如何让我的Spring Boot应用程序监听多个队列的任何想法?

  • 兔子配置: 应用概述:每当gitRepository连接到我们的应用程序时,存储库名称就会成为交换名称,在这种情况下,然后存储库的每个分支都会创建自己的队列,这里有两个队列和。现在每次在开发分支中创建拉取请求时,我都需要将信息传递给开发队列,并且应该由特定的侦听器侦听,该侦听器应该仅注册用于开发。我看到了动态队列的示例,但我似乎找不到任何关于如何创建将使用不同线程执行的动态侦听器的示例,我如何实现

  • 在这篇文章中,加里·拉塞尔解释了如何通过编程创建多个Kafka列斯汀来聆听多个主题。。Kafka·斯普林:如何动态或在循环中创建监听器? 现在我想有一个类似的设置也适用于JMSListeners-在那里我可以有一个带有一个@JMSListener的类,并且我可以以编程方式创建该JMSListener的多个实例,每个实例都注入了自己的queueName。 我发现这篇文章Spring JMS开始根据请

  • 我最近发现自己正在编写以下代码: 一位同事指出 然而, 基于这一点,我得到的印象是我没有正确理解,我开始怀疑我的原始代码是否安全。 DR 使用引用要用作侦听器且需要多次引用的方法(例如,添加+删除)是否安全? 关于匿名类等的幕后实际发生了什么?