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

9 java messaging channel publish-subscribe rabbitmq

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

channel.basicConsume(queueName, autoAck, consumerTag, noLocal,
    exclusive, arguments, callback);
Run Code Online (Sandbox Code Playgroud)

让我们能够告诉RabbitMQ我们想要使用哪个队列.

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

channel.basicPublish(exchangeName, routingKey, mandatory, immediateFlag,
    basicProperties, messageAsBytes);
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*chl 20

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

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

channel.basicPublish("", myQueueName, false, false, null, myMessageAsBytes);
Run Code Online (Sandbox Code Playgroud)

也就是说,这大多违背了RabbitMQ的工作原理.对于正常的应用程序流程,您应该声明并绑定交换.但对于特殊情况,"作弊"可能很有用.例如,我相信这是Rabbit管理控制台允许您在没有创建和绑定交换的所有仪式的情况下手动将消息发布到队列的方式.

  • 惊人。正是我需要的自动化测试。谢谢 (2认同)

Vis*_*ohn 14

基本上,队列可以基于routingKeys绑定到交换机.

假设您有3个不同的发布者.
Publisher1发送消息与routingKey交换"事件"
Publisher2发送消息与routingKey"任务"
交换发布者3发送消息与routingKey"jobs"交换

您可以让消费者仅使用具有特定routhingKey的消息.
例如,为了让消费者获得"事件"消息,您可以这样声明

 channel.queueBind(queueName, exchangeName, "events");
Run Code Online (Sandbox Code Playgroud)

如果您想要使用进入交换机的所有消息,请将路由选择为"#"

简而言之,我可以说的是,
1.消息将发布到交易所.
2.队列将基于routingKeys进行交换.
3. RabbitMQ将具有匹配路由密钥的消息转发到相应的队列.

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

RabbitMQ中消息传递模型的核心思想是生产者永远不会将任何消息直接发送到队列.实际上,生产者通常甚至不知道消息是否会被传递到任何队列.相反,生产者只能向交易所发送消息


Tie*_*yen 5

请尝试这个:

channel.basicPublish("", yourQueueName, null,
        message.getBytes((Charset.forName("UTF-8"))));
Run Code Online (Sandbox Code Playgroud)

它对我的项目有用。

  • 谢谢@tien nguyen (+1) - 但是,看起来您正在使用 [`basicPublish(java.lang.String Exchange, java.lang.StringroutingKey, AMQP.BasicProperties props, byte[] body)`](http ://www.rabbitmq.com/releases/rabbitmq-java-client/v1.7.2/rabbitmq-java-client-javadoc-1.7.2/com/rabbitmq/client/Channel.html#basicPublish%28java.lang.String ,%20java.lang.String,%20com.rabbitmq.client.AMQP.BasicProperties,%20byte[]%29) `basicPublish` 重载。在该重载中,第二个参数(作为“yourQueueName”)称为“routingKey”。那么,“routingKey”是 RabbitMQ 术语“队列名称”吗? (2认同)