【问题标题】:RabbitMq : Create queue dynamicallyRabbitMq:动态创建队列
【发布时间】:2015-06-16 03:21:31
【问题描述】:

我有一个场景,我想使用特定的路由密钥将一些消息发布到rabbitmq-exchange,例如。 abc

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

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

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

【问题讨论】:

  • 在 JMS 中我不知道 - 如果是 .NET,我建议使用 HareDU 包作为起点来检查队列是否已经存在。 github.com/ahives/HareDu
  • 我不想进行显式 API 命中来检查队列是否存在,但我想检查是否有办法修改交换的默认行为以创建队列(如果不存在)已经。
  • @rahulroc , stackoverflow.com/questions/21265242/… 这可能对你有帮助
  • Kishor,没用。他要问的是在模式上动态附加到队列

标签: jms rabbitmq message-queue rabbitmq-exchange


【解决方案1】:

根据我的研究,我不知道如何配置服务器端以动态创建队列。但是,您可以在客户端执行此操作以达到相同的效果:

在频道上实现ReturnListener 以侦听无法路由的消息。查看此页面上的“处理不可路由的消息”部分以获取示例:

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

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

【讨论】:

  • 这又是一个我已经知道的客户端配置。我正在寻找的是一些交易所/经纪人方面的配置
【解决方案2】:

您的案例没有 afaik 默认行为。您可以创建一个插件,也可以依赖客户端逻辑,这是我回答的目的。

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

声明队列,如果需要则创建。此方法创建或检查队列。 创建新队列时,客户端可以指定各种属性 控制队列及其内容的持久性,以及 队列的共享级别。

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

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

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

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

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

按照 GeekChick 的建议,您可以注册 ReturnListener。所有消息必须使用mandatory flag发送

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

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

【讨论】:

  • 您指出的所有方法都涉及客户端逻辑,这会产生额外的开销。我知道队列创建是一个幂等操作,在创建队列时需要指定一些属性,但我想弄清楚的是一些可以指定一些默认属性的配置,并且队列是自动创建的。
猜你喜欢
  • 2014-02-11
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 2020-02-04
  • 1970-01-01
相关资源
最近更新 更多