【问题标题】:How to tell which amqp message was not routed from basic.return response?如何判断哪个 amqp 消息不是从 basic.return 响应路由的?
【发布时间】:2014-01-24 15:42:01
【问题描述】:

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

我的问题是,据我所知,basic.return 是异步的,并且不包含有关未找到队列的消息的任何信息。即使交换处于确认模式)。我到底应该怎么知道返回了哪条消息?

【问题讨论】:

  • 如果您提供更多信息,例如语言和库,将会有所帮助。

标签: rabbitmq amqp


【解决方案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();
            }
    });
}

【讨论】:

    【解决方案2】:

    我阅读了 AMQP 规范,因为我之前使用过基本返回没有问题,但我也在使用 .NET 客户端。我查看了关于 node-amqp 的文档,我什至看不到它实现了 Basic.Return。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      相关资源
      最近更新 更多