RabbitMQ и node-amqp — обмен по умолчанию не подтверждается

Кажется, я не могу получить подтверждение, когда публикую на бирже по умолчанию. В настоящее время я использую главную ветвь node-amqp, предложенную этот пост.

Код:

var amqp = require('amqp');
var conn = amqp.createConnection({ host: 'localhost' });

conn.once('ready', function () {
    conn.publish('test_queue', 'test message', { /* empty options */ }, function (a, b) {
        console.log('Publish complete.');
    });
});

Я считаю, что обмен по умолчанию — это прямой обмен с пустой строкой (все остальные параметры по умолчанию). Согласно методу exchange.publish, если параметр подтверждения имеет значение true, он вызовет предоставленный обратный вызов. Я пытался создать обмен самостоятельно, но и там не повезло.

var amqp = require('amqp');
var conn = amqp.createConnection({ host: 'localhost' });

conn.once('ready', function () {
    conn.exchange('', { confirm: true }, function (exchange) {
        exchange.publish('test_queue', 'test message', { /* empty options */ }, function (a, b) {
            console.log('Publish complete.');
        });
    });
});

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

Выдает ли обмен по умолчанию сообщение подтверждения в методе публикации? Я неправильно это называю?


person matth    schedule 27.11.2013    source источник


Ответы (1)


  1. Вам необходимо подключиться к очереди перед публикацией, просто указать имя очереди в вызове для публикации недостаточно.
  2. Нужно привязать очередь к обмену, иначе опубликовать не получится.

Что-то типа:

connection.queue("test_queue", function(q) {
    q.bind(exchange, function() {
        exchange.publish(...);
    }
});

Это заставит ваше сообщение попасть в указанную очередь с вашим новым обменом, и будет выполнен обратный вызов. Если вы похожи на меня и не читали документацию должным образом, не то, что обратный вызов от публикации отправит false, чтобы указать на успех (т.е. errorHasOccured является первым аргументом обратного вызова).

person Anders Bornholm    schedule 31.01.2014
comment
Я не уверен на 100%, но я думаю, что это не относится к обмену по умолчанию (очереди привязаны к нему по умолчанию). Когда я пытаюсь это сделать, я получаю ошибку 403, которая не разрешена при ошибке обмена по умолчанию. - person Guido; 14.04.2014
comment
Да, дело в том, что вам нужно создать другой обмен, так как по умолчанию не подтверждается, что сообщение было успешно опубликовано. - person Anders Bornholm; 15.04.2014