如果未设置确认模式,则不会收到多条消息

时间:2018-09-01 04:40:07

标签: node.js

根据here,我正在使用amqp-connection-manager

我的reciever.js代码如下所示:

var QUEUE_NAME = 'test';

var amqp = require('amqp-connection-manager');


// Handle an incomming message.
var onMessage = function (data) {
    var message = JSON.parse(data.content.toString());
    console.log("receiver: got message", message);
    //channelWrapper.ack(data);
}

// Create a connetion manager
var connection = amqp.connect([process.env.CLOUDAMQP_MQTT_URL], {reconnectTimeInSeconds: 2, json: true});
connection.on('connect', function () {
    console.log('Connected!');
});
connection.on('disconnect', function (params) {
    console.log('Disconnected.', params.err.stack);
});

// Set up a channel listening for messages in the queue.
var channelWrapper = connection.createChannel({
    setup: function (channel) {
        // `channel` here is a regular amqplib `ConfirmChannel`.
        return Promise.all([
            channel.assertQueue(QUEUE_NAME, {durable: true}),
            channel.prefetch(1),
            channel.consume(QUEUE_NAME, onMessage)
        ]);
    }
});

channelWrapper.waitForConnect()
    .then(function () {
        console.log("Listening for messages");
    });

现在,这里发生的是如果我不写channelWrapper.ack(data),它将停止接收消息。因此,如何在不编写channelWrapper.ack(data)的情况下启用接收消息。

1 个答案:

答案 0 :(得分:1)

这是因为您要将prefetch的值设置为1。预取是在接收更多消息之前,您可以在通道或队列上拥有的未确认消息的数量(取决于配置)。 您可以通过在代码中更改以下行来更改预取值:

channel.prefetch(1)

使用当前设置,您最终必须确认消息才能获得更多消息。如果您正在对此消息进行一些异步工作,并且在异步工作完成后稍后再确认但又不想等待它获取其他消息,则只需将预取计数设置为合理的数量即可。

如果您确实确定不需要确认消息,可以告诉经纪人不要期望noAck: true进行确认,只需更改此行即可:

channel.assertQueue(QUEUE_NAME, {durable: true, noAck: true})