RabbitMQ:交换消息,没有任何现有绑定

时间:2016-02-26 10:51:58

标签: rabbitmq amqp

我正在向主题交换发送消息,该交换没有任何绑定到任何队列。只是一个空白的交换。 频道创建为确认频道,每次发送消息时都会调用我的确认回叫。 奇怪的是,对于每条消息,我都会得到确认。

我做错了什么或者误解了发布商确认的方式吗? 我如何知道消息是否被路由到队列或被交换机丢弃?

我正在使用amqplib作为节点。

4 个答案:

答案 0 :(得分:1)

这是设计的。检查此link。它清楚地说:

  

何时会确认消息?

     

对于不可路由的消息,经纪人   一旦交易所验证了一条消息不会路由,我们将发出确认   到任何队列(返回一个空的队列列表)。如果消息也是   作为强制发布,basic.return之前发送给客户端   basic.ack。负面致谢也是如此   (basic.nack)。

     

对于可路由消息,在消息发送时发送basic.ack   被所有队列接受。对于路由到持久性的持久性消息   队列,这意味着持久化到磁盘。对于镜像队列,这意味着   所有镜子都接受了这个消息。

答案 1 :(得分:1)

我相信误解在于以下事实:“ Ack”表示服务器成功路由了邮件。

但是上一条语句为 false 。确认实际上表示服务器能够成功处理该消息。

您可以像RabbitMQ服务器所说的那样:我对您的消息负责

basic.nack仅在负责队列的Erlang进程中发生内部错误时发送。

由以下链接引用 https://www.rabbitmq.com/confirms.html

答案 2 :(得分:1)

我已经尝试了 channel.confirmSelect() 并且它不保证消息发送到队列,而不是保证消息发布到交换。如果此时没有绑定队列,那么 RabbitMQ 服务器将简单地丢弃该消息。

答案 3 :(得分:0)

好吧,我可能没有清楚地解释我的问题。所以这里有一些代码:

var amqp = require('amqplib/callback_api');
amqp.connect('amqp://host' , function(err, conn) {

    conn.createConfirmChannel(function(err, ch) {

        channel.assertExchange('my_awsome_exchange', 'topic', {durable: true});

        channel.publish('my_awsome_exchange', 'routing_key', new Buffer('some data'),
        {
            mandatory: true
        },
        function(err){
           // err is null no matter if a queue is bound to the exchange or not
           console.log(err);
        });
    });
});

正如您所见,创建了一个交换,但尚未绑定任何队列。所以我的期望是向这个交易所发送消息永远不会被激活。 @Teddy:我从文档中了解到这一节,这就是为什么我这么困惑的原因。 由于消息未被路由到任何队列,我本来期望消息被解雇。