我正在使用RabbitMQ和node-amqp lib。我發佈了帶有強制標誌設置的消息,並且當沒有路由到任何隊列時,RabbitMQ按照規範迴應basic.return
。如何判斷哪個amqp消息沒有從basic.return響應中路由?
我的問題是,據我所知,basic.return
是異步的,並且不包含有關哪些消息沒有找到隊列的任何信息。即使交換處於確認模式)。我應該怎麼告訴哪條消息被返回?
我正在使用RabbitMQ和node-amqp lib。我發佈了帶有強制標誌設置的消息,並且當沒有路由到任何隊列時,RabbitMQ按照規範迴應basic.return
。如何判斷哪個amqp消息沒有從basic.return響應中路由?
我的問題是,據我所知,basic.return
是異步的,並且不包含有關哪些消息沒有找到隊列的任何信息。即使交換處於確認模式)。我應該怎麼告訴哪條消息被返回?
節點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();
}
});
}
我閱讀了AMQP規範,因爲我之前使用了基本返回而沒有任何問題,但是我也使用.NET客戶端。我查看了node-amqp上的文檔,我甚至看不到它實現了Basic.Return。
無論如何,當服務器無法發佈時,服務器確實會使用完整消息進行響應。你可以考慮切換到不同的Node.js庫(例如,amqplib
確實有這個功能(標記爲Channel#on('return', function(msg) {...})
)。
這將是在幫助,如果你提供更多的信息,如語言和圖書館。 – pinepain