我正在使用节点AMQP模块连接到RabbitMQ。我能够连接,创建交换,队列并能够将消息发送/发布到交换机。我可以确认消息是在管理控制台上发布的。
问题是我没有收到交换发布呼叫的回调。这是我的代码。
初始化:( app是express.js实例)
app.rabbitMQConnection = amqp.createConnection({ host: 'myurl.com', login: 'login', password: 'pwd' });
app.rabbitMQConnection.on('ready', function(){
console.log("RabbitMQ server connected");
app.rabbitMQConnection_e = app.rabbitMQConnection.exchange('my-exchange', { confirm: true, durable: true, autoDelete: false }, function (q) {
app.rabbitMQConnection_q_lisorders = app.rabbitMQConnection.queue('shoe-orders', {autoDelete: false, durable: true}, function (q) {
app.rabbitMQConnection_q_lisorders.bind(app.rabbitMQConnection_e, '#');
});
});
});
然后,当我需要发送消息时,我使用:
app.rabbitMQConnection_e.publish('routingKey', { message: myMessage }, { deliveryMode: 2 }, function(transmissionFailed){
if (transmissionFailed == true){
console.log("message failed");
}else{
console.log("message sent");
}
});
永远不会调用回调函数(transmissionFailed)。请帮忙!
答案 0 :(得分:0)
Doc不够明确。当我们使用它时,
调用时:connection.exchange(name,options = {},openCallback)
然后回调有交换对象,用于发布消息。
您的代码将是:
app.rabbitMQConnection.exchange('my-exchange', { confirm: true, durable: true, autoDelete: false }, function (q) {
app.rabbitMQConnection_e = q;
.....
});
然后:
app.rabbitMQConnection_e.publish('routingKey', { message: myMessage }, { deliveryMode: 2 }, function(transmissionFailed){
if (transmissionFailed == true){
console.log("message failed");
}else{
console.log("message sent");
}
});
答案 1 :(得分:0)
回调是一个函数,如果交换处于确认模式,将被调用,发送的值将为true或false,这是错误的存在,如此真实,意味着发生错误和false,意味着发布成功
所以我们应该在创建交换时将交易所设置为确认模式