【问题标题】:RabbitMQ & node-amqp - default exchange doesn't confirmRabbitMQ & node-amqp - 默认交换未确认
【发布时间】:2013-11-27 20:43:17
【问题描述】:

当我发布到默认交易所时,我似乎无法得到确认。我目前正在使用 this post 建议的 node-amqp 的 master 分支。

代码:

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 method,如果确认选项为真,它将调用提供的回调。我尝试自己创建交换,但也没有运气。

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.');
        });
    });
});

我可以使用 RabbitMQ 网站上的basic python receive script 确认我已成功发布消息。

默认交换是否在发布方法中发出确认消息?我是不是叫错了?

【问题讨论】:

    标签: node.js rabbitmq node-amqp


    【解决方案1】:
    1. 您需要在发布前连接到队列,仅在发布调用中提供队列名称是不够的。
    2. 您需要将队列绑定到交换器,否则发布将不起作用。

    类似:

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

    这将使您的消息与您的新交换一起进入指定队列,并进行回调。如果你像我一样没有正确阅读文档,并不是来自发布的回调将发送 false 以指示成功(即 errorHasOccured 是回调的第一个参数)。

    【讨论】:

    • 我不是 100% 确定,但我认为这不适用于默认交换(队列默认绑定到它)。当我尝试这样做时,我收到 403“默认交换上不允许的操作”错误。
    • 是的,关键是您需要创建一个不同的交换,因为默认不确认消息已成功发布。
    猜你喜欢
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2015-01-24
    • 2018-09-30
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多