Jms RabbitMq:动态创建队列

Jms RabbitMq:动态创建队列,jms,rabbitmq,message-queue,rabbitmq-exchange,Jms,Rabbitmq,Message Queue,Rabbitmq Exchange,我有一个场景,我想使用特定的路由密钥(例如abc)将一些消息发布到rabbitmq exchange 问题是可能已经有任何队列已经绑定了路由键“abc”,也可能没有。这种情况下的行为可能是丢弃该消息,或者如果配置了死信交换,它将被路由到死信交换 我希望动态创建一个与路由密钥同名的队列,即“abc”,如果该路由密钥不存在队列,而不是将其丢弃或发送到DLX 有任何已知的方法可以做到这一点吗?根据我的研究,我不知道如何配置服务器端以动态创建队列。但是,您可以在客户端执行此操作以实现相同的效果: 在频道

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

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

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


有任何已知的方法可以做到这一点吗?

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

在频道上执行一个
ReturnListener
,以侦听无法发送的消息。请参阅本页的“处理无法发送的邮件”部分,以获取示例:


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

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

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

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

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

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

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

如何做到这一点取决于您的RabbitMQ客户端。例如,可以使用扩展和替代

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

按照GeekChick的建议,您可以注册一个。所有消息必须与

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


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

在JMS中,我不知道-如果是.NET,我建议使用HareDU包作为起点来检查队列是否已经存在。我不想通过显式API命中来检查队列是否存在,但我想检查是否有方法修改exchange的默认行为,以创建队列(如果尚未存在)。@rahulroc,这可能会帮助youKishor,但没有帮助。他试图要求的是在模式上动态地附加到队列。您指出的所有方法都涉及客户端逻辑,这会产生额外的开销。我知道队列创建是一个幂等操作,在创建队列时需要指定一些属性,但我想弄清楚的是一些配置,可能会指定一些默认属性,队列会自动创建。这也是我已经知道的客户端配置。我想要的是一些exchange/broker端配置