Node.js 拉比特公司;节点amqp-默认交换不';不确定

Node.js 拉比特公司;节点amqp-默认交换不';不确定,node.js,rabbitmq,node-amqp,Node.js,Rabbitmq,Node Amqp,当我发布到默认exchange时,我似乎无法得到确认。我目前正在使用由建议的节点amqp的主分支 代码: 我相信默认的交换是带有空字符串的直接交换(所有其他选项都是默认的)。根据,如果确认选项为true,它将调用提供的回调。我试图自己创建交换,但也没有运气 var amqp = require('amqp'); var conn = amqp.createConnection({ host: 'localhost' }); conn.once('ready', function () {

当我发布到默认exchange时,我似乎无法得到确认。我目前正在使用由建议的节点amqp的主分支

代码:

我相信默认的交换是带有空字符串的直接交换(所有其他选项都是默认的)。根据,如果确认选项为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.');
        });
    });
});
我可以通过使用RabbitMQ网站上的来确认已成功发布消息

默认exchange是否在发布方法中发出确认消息?我打错电话了吗

  • 发布前需要连接到队列,仅在发布调用中提供队列名称是不够的
  • 您需要将队列绑定到exchange,否则发布将无法工作
  • 比如:

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

    这将使您的邮件与新exchange一起进入指定队列,并进行回调。如果您和我一样,没有正确阅读文档,则publish的回调不会发送false以表示成功(即ErrorHasOccursed是回调的第一个参数)。

    我不是100%确定,但我认为这不适用于默认exchange(默认情况下队列绑定到它)。当我尝试这样做时,会出现403“默认exchange上不允许操作”错误。是的,问题是您需要创建一个不同的exchange,因为默认exchange不会确认消息已成功发布。
    connection.queue("test_queue", function(q) {
        q.bind(exchange, function() {
            exchange.publish(...);
        }
    });