RabbitMq:动态创建队列

时间:2015-04-10 11:59:36

标签: jms rabbitmq message-queue rabbitmq-exchange

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

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

我想动态创建一个与路由密钥同名的队列,即如果该路由密钥没有队列,则为“abc”,而不是丢弃或发送给DLX。

有没有任何已知方法可以做同样的事情?

2 个答案:

答案 0 :(得分:1)

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

在频道上实施ReturnListener以收听不可路由的消息。查看"处理不可路由的消息"本页的相关部分:

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

然后,您可以使用传递给处理程序的routingKey使用queueDeclare()queueBind()方法创建具有相同名称的队列(请参阅&# 34;在同一个链接上使用交换和队列"为例子。

答案 1 :(得分:1)

您的案件没有afaik defaut行为。您可以创建一个插件,或者您可以依赖客户逻辑,这是我的答案的目的。

重要的是要知道RabbitMQ队列declare / bind是idempotent operation

  

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

假设1:队列无法删除或队列可以删除但客户端会知道,队列集可以适合内存

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

在bootstrap中,可以使用现有队列初始化队列集,例如使用HTTP API(例如a java client

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

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

根据GeekChick的建议,您可以注册ReturnListener。必须使用mandatory flag

发送所有邮件

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

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