首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为RabbitMQ和Spring动态注册一个队列及其独占的消费者/监听器?

如何为RabbitMQ和Spring动态注册一个队列及其独占的消费者/监听器?
EN

Stack Overflow用户
提问于 2017-12-18 18:44:32
回答 1查看 661关注 0票数 1

我有以下问题需要解决:我正在尝试使用RabbitMQ消息实现一个简单的延迟重试机制。我有一个基础设施,它为我提供了传递消息的延迟。我可以有许多感兴趣的参与者,他们希望在运行时利用这种延迟重试机制。

参与者只想向我提供两个详细信息和消息: 1.他们希望在延迟T秒后将消息传递到的队列名称。2.队列的消费者(比如消息的消费者)。

我尝试做了以下几件事:

代码语言:javascript
复制
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相同?

我试着搜索了很多关于它的信息,但是没有得到任何具体的解释。如果这是一个重复的问题,请提前道歉,并为任何天真而道歉。

EN

回答 1

Stack Overflow用户

发布于 2017-12-18 22:47:54

我不能以某种方式编译你的问题,但我能告诉你的是,在RabbitMQ和Sring supports它很好地已经有了失效的交换解决方案。

我建议远离动态添加的SimpleMessageListenerContainer:它并不像看起来那么简单。有一个像addQueueNames()这样的选项

代码语言:javascript
复制
/**
 * 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_consumerQueue进行的下游路由可能有助于区分来自不同队列的消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47866755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档