7

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

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

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

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

4

2 回答 2

2

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

重要的是要知道 RabbitMQ 队列声明/绑定是幂等操作

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

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

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

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

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

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

根据 GeekChick 的建议,您可以注册一个ReturnListener. 所有消息必须使用强制标志发送

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

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

于 2015-04-14T04:35:38.660 回答
2

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

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

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

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

于 2015-04-13T20:33:29.290 回答