java - RabbitMQ:如何指定要发布到的队列?

标签 java rabbitmq messaging publish-subscribe channel

RabbitMQ 的Channel#basicConsume 方法为我们提供了以下参数:

channel.basicConsume(queueName, autoAck, consumerTag, noLocal,
    exclusive, arguments, callback);

让我们能够准确地告诉 RabbitMQ 我们要从哪个队列中消费。

但是 Channel#basicPublish 没有这样的等价物:

channel.basicPublish(exchangeName, routingKey, mandatory, immediateFlag,
    basicProperties, messageAsBytes);

为什么我不能在这里指定要发布的队列?!? 我如何获得一个Channel 发布到一个名为logging 的队列?提前致谢!

最佳答案

为了扩展@Tien Nguyen 的回答,RabbitMQ 中有一个“作弊”可以有效地让您直接发布到队列。每个队列都自动绑定(bind)到 AMQP 默认交换器,队列的名称作为路由键。默认交换也被称为“无名交换”——即它的名字是空字符串。因此,如果您使用等于队列名称的路由键发布到名为 "" 的交换器,消息将只发送到该队列。正如@John 所说,它正在经历一场交流,它只是您不需要声明或约束自己的交流。

我没有方便的 Java 客户端来尝试此代码,但它应该可以工作。

channel.basicPublish("", myQueueName, false, false, null, myMessageAsBytes);

也就是说,这在很大程度上违背了 RabbitMQ 的工作原理。对于正常的应用程序流程,您应该声明和绑定(bind)交易所。但对于特殊情况,“作弊”可能会有用。例如,我相信这就是 Rabbit 管理控制台允许您手动将消息发布到队列的方式,而无需所有创建和绑定(bind)交换的仪式。

关于java - RabbitMQ:如何指定要发布到的队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18531308/

相关文章:

java - 查找字符串特征上的欧几里德距离

java - 忘记密码功能 Spring(密码找回)

node.js - RabbitMQ 和 Node.js 如何处理故障转移场景?

rabbitmq - 单个队列,多个@RabbitListener但服务不同

java - MQJE018 : Protocol error - unexpected segment type received

java - epub 文件不可下载 [ANDROID]

java - 来自 Java SE 的 JMS 连接

java - 如何在 Android KitKat (4.4) 中发送彩信?

node.js - 安排一个小时、一天、一周等时间的事件

jquery - 用于消息系统滚动消息的 CSS,并始终将回复框保持在屏幕底部