我正在使用带有node-amqp lib的RabbitMQ。我正在发布带有强制标志设置的消息,当没有到任何队列的路由时,RabbitMQ会按照规范响应basic.return
。
我的问题是,就我所知,basic.return
是异步的,并且不包含有关哪个消息没有找到队列的任何信息。即使交换处于确认模式)。我该怎么回事告诉你哪条消息?
答案 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) {...})
)。