0

我正在使用 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);
4

0 回答 0