根据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)
的情况下启用接收消息。
答案 0 :(得分:1)
这是因为您要将prefetch
的值设置为1
。预取是在接收更多消息之前,您可以在通道或队列上拥有的未确认消息的数量(取决于配置)。
您可以通过在代码中更改以下行来更改预取值:
channel.prefetch(1)
使用当前设置,您最终必须确认消息才能获得更多消息。如果您正在对此消息进行一些异步工作,并且在异步工作完成后稍后再确认但又不想等待它获取其他消息,则只需将预取计数设置为合理的数量即可。
如果您确实确定不需要确认消息,可以告诉经纪人不要期望noAck: true
进行确认,只需更改此行即可:
channel.assertQueue(QUEUE_NAME, {durable: true, noAck: true})