我有一个场景,我想使用特定的路由键将一些消息发布到rabbitmq-exchange,例如。 ABC
问题是可能已经存在任何已使用路由密钥“abc”绑定的队列,或者可能没有。这种情况的行为似乎是丢弃该消息,或者如果配置了死信交换,它将被路由到死信交换。
我想动态创建一个与路由密钥同名的队列,即如果该路由密钥没有队列,则为“abc”,而不是丢弃或发送给DLX。
有没有任何已知方法可以做同样的事情?
答案 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的成本一旦创建,应该或多或少等于网络足迹+地图查找。