2014-01-24 38 views
0

我正在使用RabbitMQ和node-amqp lib。我發佈了帶有強制標誌設置的消息,並且當沒有路由到任何隊列時,RabbitMQ按照規範迴應basic.return如何判斷哪個amqp消息沒有從basic.return響應中路由?

我的問題是,據我所知,basic.return是異步的,並且不包含有關哪些消息沒有找到隊列的任何信息。即使交換處於確認模式)。我應該怎麼告訴哪條消息被返回?

+0

這將是在幫助,如果你提供更多的信息,如語言和圖書館。 – pinepain

回答

1

節點AMQP發出'basic-return'事件從AMQP接受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(); 
      } 
    }); 
} 
0

我閱讀了AMQP規範,因爲我之前使用了基本返回而沒有任何問題,但是我也使用.NET客戶端。我查看了node-amqp上的文檔,我甚至看不到它實現了Basic.Return。

無論如何,當服務器無法發佈時,服務器確實會使用完整消息進行響應。你可以考慮切換到不同的Node.js庫(例如,amqplib確實有這個功能(標記爲Channel#on('return', function(msg) {...}))。

相關問題