代码之家  ›  专栏  ›  技术社区  ›  user1768830

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

  •  16
  • user1768830  · 技术社区  · 11 年前

    拉比特MQ Channel#basicConsume 方法提供了以下参数:

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

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

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

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

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

    3 回复  |  直到 11 年前
        1
  •  34
  •   Brian Reischl    11 年前

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

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

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

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

        2
  •  18
  •   Vishal John    11 年前

    基本上,队列可以基于routingKeys绑定到交易所。

    假设您有3个不同的发布者。
    Publisher1正在发送消息以与routingKey“events”进行交换
    Publisher2正在发送消息以与routingKey“tasks”交换
    Publisher3正在发送消息以与routingKey“jobs”进行交换

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

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

    如果您想消耗所有到达交换机的消息,则将路由设置为“#”

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

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

    RabbitMQ中消息传递模型的核心思想是,生产者从不直接向队列发送任何消息。实际上,通常情况下,生产者甚至不知道消息是否会被传递到任何队列。相反,生产者只能向交换机发送消息

        3
  •  5
  •   Tien Nguyen    11 年前

    请尝试以下操作:

    channel.basicPublish("", yourQueueName, null,
            message.getBytes((Charset.forName("UTF-8"))));
    

    它对我的项目起到了作用。