如何判断哪个amqp消息没有从basic.return响应路由?

时间:2014-01-24 15:42:01

标签: rabbitmq amqp

我正在使用带有node-amqp lib的RabbitMQ。我正在发布带有强制标志设置的消息,当没有到任何队列的路由时,RabbitMQ会按照规范响应basic.return

我的问题是,就我所知,basic.return是异步的,并且不包含有关哪个消息没有找到队列的任何信息。即使交换处于确认模式)。我该怎么回事告诉你哪条消息?

2 个答案:

答案 0 :(得分:1)

node-amqp在从amqp接收'basic-return'时发出basic.return事件。唯一有用的是路由键。由于具有相同路由密钥的所有消息都以相同的方式路由。我假设一旦获得关于特定路由密钥的basic.return,具有此路由密钥的所有消息都可被视为未传递

function deliver(routing_key, message, exchange, resolve, reject){
    var failed_delivery = function(ret){
        if(ret.routingKey == routing_key){
            exchange.removeListener('basic-return', failed_delivery);
            reject(new Error('failed to deliver'));
        }
    };
    exchange.on('basic-return', failed_delivery);
    exchange.publish( 
        routing_key,
        message,
        {   deliveryMode: 1, //non-persistent
            mandatory: true
        }, function(error_occurred, error){
            exchange.removeListener('basic-return', failed_delivery);
            if(error_occurred){
                reject(error);
            } else {
                resolve();
            }
    });
}

答案 1 :(得分:0)

我阅读了AMQP规范,因为我以前使用过Basic Return而没有问题,但我也在使用.NET客户端。我查看了node-amqp上的文档,我甚至看不到它实现了Basic.Return。

无论如何,当服务器无法发布时,服务器会回复完整的消息。您可以考虑切换到不同的Node.js库(例如,amqplib确实具有此功能(标记为Channel#on('return', function(msg) {...}))。