我正在使用 RabbitMQ 队列在消费者之间发布和接收消息,主要问题是我想接收一条消息然后退出。从这个网站上的其他答案中,我看到这channel.get
似乎是最好的方法。但是,我无法让它工作。这是我一直在使用的答案。
我当前的代码:
var amqpChannel = null;
var queue = "test";
amqp.connect(cluster, (error0, connection) => {
if (error0) throw error0;
connection.createChannel((error1, channel) => {
if (error1) throw error1;
amqpChannel = channel;
});
});
var readMessage = function() {
if (amqpChannel)
{
amqpChannel.get(queue, (err, msg) => {
if (err) console.log(err);
if (msg)
{
console.log("Message received: " + msg.content.toString());
amqpChannel.ack(msg);
}
});
}
}
setTimeout(readMessage, 1000);
据我所知,它与上面接受的答案中的代码相同,但是我似乎无法让它工作。我错过了什么?
编辑:额外信息
使用channel.consume
对我有用,它可以获取队列中的任何消息。但是,使用该channel.get
方法一无所获。我使用console.log
线条来确保正确创建通道,但由于某种原因,channel.get
回调永远不会被触发。我知道所有连接和队列创建都在工作,我似乎根本无法获得channel.get
触发方法。
编辑2:我发现了问题
我的回调函数不正确。查看此处的文档,在回调之前channel.get
需要一个options
参数,并将其添加到修复了我的问题中。我的工作代码现在是:
var amqpChannel = null;
var queue = "test";
amqp.connect(cluster, (error0, connection) => {
if (error0) throw error0;
connection.createChannel((error1, channel) => {
if (error1) throw error1;
amqpChannel = channel;
});
});
var readMessage = function() {
if (amqpChannel)
{
amqpChannel.get(queue, {noAck: true}, (err, msg) => {
if (err) console.log(err);
if (msg)
{
console.log("Message received: " + msg.content.toString());
amqpChannel.ack(msg);
}
});
}
}
setTimeout(readMessage, 1000);