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

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

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

让我们能够准确地告诉RabbitMQ我们想要从哪个队列中使用。

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

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

为什么我无法指定要发布到此处的队列?!?如何获取通道发布到名为日志记录的队列?提前致谢!


答案 1

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

我没有Java客户端来尝试这个代码,但它应该可以工作。

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

也就是说,这在很大程度上与RabbitMQ的工作方式背道而驰。对于正常的应用程序流,应声明和绑定交换。但对于特殊情况,“作弊”可能很有用。例如,我相信这就是 Rabbit Admin Console 允许您手动将消息发布到队列的方式,而无需创建和绑定交换的所有仪式。


答案 2

基本上,队列可以基于路由键绑定到交换。

假设您有 3 个不同的发布者。
发布者1 发送消息以与路由交换密钥“事件”
发布者2 发送要与路由交换的消息Key “任务”
Publisher3 发送要与路由交换的消息Key “作业”

你可以有一个使用者,它只使用具有特定 routhingKey 的消息。
例如,为了让“事件”消息有一个消费者,你像这样声明

 channel.queueBind(queueName, exchangeName, "events");

如果您想使用所有进入交易所的消息,请将路由设置为“#”

简而言之,我能说的是,
1。消息将发布到交易所。
2. 队列将绑定到基于路由键进行交换。
3. RabbitMQ 会将具有匹配路由键的消息转发到相应的队列。

请参阅教程 - http://www.rabbitmq.com/tutorials/tutorial-three-java.html

RabbitMQ 中消息传递模型的核心思想是生产者从不将任何消息直接发送到队列。实际上,很多时候,生产者甚至根本不知道消息是否会传递到任何队列。相反,创建者只能将消息发送到交换


推荐