Rabbitmq не сохраняет сообщение в обмен, если нет подписчика? - PullRequest
0 голосов
/ 18 января 2019

У меня есть следующие издатель и подписчик:

// 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, я ожидаю, что подписчик напечатаетдва сообщения, которые я опубликовал в прошлом, но на самом деле подписчик не получает никаких сообщений.

Как разрешить RabbitMQ сохранять опубликованные сообщения, которые позволяют любому подписчику использовать с самого начала или везде, где они потребляли в прошлый раз?

1 Ответ

0 голосов
/ 19 января 2019

Если RabbitMQ не может направить сообщение в очередь, сообщение отбрасывается.

Поскольку вы запускаете код издателя до кода подписчика, к вашему обмену не привязана очередь, и, следовательно, некуда направить сообщение.

Вам необходимо либо запустить свой код подписчика перед вашим издателем, либо вам нужно, чтобы ваш издатель или какой-либо другой процесс создал и привязал именованную очередь к вашему обмену. Затем ваш подписчик будет использовать эту очередь.


ПРИМЕЧАНИЕ: команда RabbitMQ отслеживает список рассылки rabbitmq-users и только иногда отвечает на вопросы по StackOverflow.

...