首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RabbitMq :动态创建队列

RabbitMq :动态创建队列
EN

Stack Overflow用户
提问于 2015-04-10 19:59:36
回答 2查看 8.2K关注 0票数 6

我有一个场景,我想使用一个特定的路由关键字将一些消息发布到rabbitmq-exchange。abc

问题是可能已经有任何队列与路由关键字"abc“绑定,也可能没有。这类场景行为似乎是丢弃消息,或者如果配置了死信交换,它将被路由到死信交换。

我想动态创建一个与路由关键字同名的队列,即,如果没有该路由关键字的队列,则创建"abc“,而不是丢弃或将其发送到DLX。

有没有什么已知的方法可以做到这一点呢?

EN

回答 2

Stack Overflow用户

发布于 2015-04-14 04:33:29

根据我的研究,我没有意识到有一种方法可以将服务器端配置为动态创建队列。但是,您可以在客户端执行此操作以达到相同的效果:

在通道上实现ReturnListener以侦听无法路由的消息。有关示例,请参阅本页上的“处理无法路由的消息”部分:

https://www.rabbitmq.com/api-guide.html

然后,您可以使用传递给处理程序的routingKey通过queueDeclare()queueBind()方法创建同名的队列(有关示例,请参阅同一链接上的“使用交换和队列”)。

票数 1
EN

Stack Overflow用户

发布于 2015-04-14 12:35:39

对于您的情况,没有afaik默认行为。你可以创建一个插件,或者你可以依赖于客户端逻辑,这就是我回答的目的。

重要的是要知道RabbitMQ队列声明/绑定是一个idempotent operation

如果needed.This方法创建或检查队列,则返回

声明队列。在创建新队列时,客户端可以指定各种属性,这些属性控制队列及其内容的持久性,以及队列的共享级别。

假设1:队列不能被删除,或者队列可以被删除,但是客户端会知道,队列集可以放入内存

每个客户端维护一组队列。在发送消息之前,客户端检查集合是否包含队列。如果不是,它声明并绑定队列,并将队列放入集合中。

在引导时,可以使用现有队列来初始化队列集,例如使用HTTP API (例如,A java client)

具体方法取决于您的RabbitMQ客户端。例如,使用spring-amqp,您可以扩展和覆盖RabbitTemplate#doSend

假设2:队列可以被删除,客户端将不知道

按照GeekChick的建议,您可以注册一个ReturnListener。所有消息都必须与mandatory flag一起发送

假设3:我不介意声明/绑定队列*的开销

在发送消息之前,您总是声明并绑定队列。AFAIK成本,一旦创建,应该或多或少等于网络足迹+地图查找。

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

https://stackoverflow.com/questions/29560879

复制
相关文章

相似问题

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