我正在用 JS 中的“Hello World”代码测试 RabbitMQ
publisher.js
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost:5672', function(error0, connection) {
if (error0) {
throw error0;
}
connection.createConfirmChannel(function(error1, channel) {
if (error1) {
throw error1;
}
var msg = 'Hello world';
channel.assertExchange('exchange2', 'fanout', {
durable: false
});
channel.publish('exchange2','', Buffer.from(msg), {},publishCallback);
channel.waitForConfirms(function(err) {if (err) console.log(err); else console.log('success');})
console.log(" [x] Sent %s", msg);
});
});
function publishCallback(err, ok) {
if (err !== null) {
// Handle the error if there was a problem with publishing
console.error('Error:', err);
} else {
// The message was successfully published
console.log('Message published successfully:', ok);
}
}
接收.js
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost:5672', function(error0, connection) {
if (error0) {
throw error0;
}
connection.createChannel(function(error1, channel) {
if (error1) {
throw error1;
}
var queue = 'hello';
channel.assertExchange('exchange2', 'fanout', {
durable: false
});
channel.assertQueue('', {
exclusive: true
}, function(error2, q) {
if (error2) {
throw error2;
}
console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q.queue);
channel.bindQueue(q.queue, 'exchange2', '');
channel.consume(q.queue, function(msg) {
if(msg.content) {
console.log(" [x] %s", msg.content.toString());
// channel.nack(msg, false, false)
}
}, {
noAck: false
});
});
});
});
我想要的是让发布者确认消息的确认。但我的问题是“channel.waitForConfirms”总是打印“成功”,即使队列中仍然有未确认的消息。
有人知道发生了什么事吗?
我尝试在发布方法中使用回调,但无论消息是否被确认,“err”参数为 null 并且“ok”参数未定义。
发布者确认:客户端发布的消息由代理异步确认,这意味着它们已在服务器端得到处理。
未确认消息:消费者未能确认消息
发布者确认是关于发布者-服务器(rabbitMQ)的。关于服务器 - 消费者的未确认
因此,在这种情况下,服务器确认消息已存储在队列中(成功),但尚未被消费者确认