我有一个场景,我想使用一个特定的路由关键字将一些消息发布到rabbitmq-exchange。abc
问题是可能已经有任何队列与路由关键字"abc“绑定,也可能没有。这类场景行为似乎是丢弃消息,或者如果配置了死信交换,它将被路由到死信交换。
我想动态创建一个与路由关键字同名的队列,即,如果没有该路由关键字的队列,则创建"abc“,而不是丢弃或将其发送到DLX。
有没有什么已知的方法可以做到这一点呢?
发布于 2015-04-14 04:33:29
根据我的研究,我没有意识到有一种方法可以将服务器端配置为动态创建队列。但是,您可以在客户端执行此操作以达到相同的效果:
在通道上实现ReturnListener以侦听无法路由的消息。有关示例,请参阅本页上的“处理无法路由的消息”部分:
https://www.rabbitmq.com/api-guide.html
然后,您可以使用传递给处理程序的routingKey通过queueDeclare()和queueBind()方法创建同名的队列(有关示例,请参阅同一链接上的“使用交换和队列”)。
发布于 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成本,一旦创建,应该或多或少等于网络足迹+地图查找。
https://stackoverflow.com/questions/29560879
复制相似问题