如果没有订阅者,Rabbitmq不会持久交换消息吗?

时间:2019-01-18 03:44:34

标签: rabbitmq publish-subscribe

我具有以下发布者和订阅者:

// publisher.js

var amqp = require('amqplib/callback_api');

amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var ex = 'logs';
    var msg = process.argv.slice(2).join(' ') || 'Hello World!';

    ch.assertExchange(ex, 'fanout', {durable: true});
    ch.publish(ex, '', new Buffer(msg));
    console.log(" [x] Sent %s", msg);
  });

  setTimeout(function() { conn.close(); process.exit(0) }, 500);
});
//subscriber.js

var amqp = require('amqplib/callback_api');

amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var ex = 'logs';

    ch.assertExchange(ex, 'fanout', {durable: true});

    ch.assertQueue('', {exclusive: true}, function(err, q) {
      console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q.queue);
      ch.bindQueue(q.queue, ex, '');

      ch.consume(q.queue, function(msg) {
        if(msg.content) {
          console.log(" [x] %s", msg.content.toString());
        }
      }, {noAck: true});
    });
  });
});

如果我运行publisher.js来发布两条消息,然后再运行subscriber.js,我希望订户打印我过去发布的两条消息,但实际上订户没有收到任何消息。 / p>

如何让RabbitMQ保留已发布的消息,以允许任何订阅者从头开始或上一次消费的地方消费?

1 个答案:

答案 0 :(得分:1)

如果RabbitMQ无法将消息路由到队列,则消息将被丢弃。

由于在发布者代码之前运行发布者代码,所以没有绑定到交换的队列,因此也无处路由消息。

您需要在发布者之前运行订阅者代码,或者必须让发布者或其他进程创建并将命名队列绑定到交换。然后,您的订户将使用该队列。


注意: RabbitMQ团队监视rabbitmq-users mailing list,并且有时仅在StackOverflow上回答问题。