Javascript RabbitMQ -> 拉取单个消息
Javascript RabbitMQ -> Pull Single Message
我正在尝试从 rabbitmq 中提取一条消息,对其进行处理,然后确认该消息。我不希望它在确认从队列中拉出消息后继续。如果我不在下面的代码中执行 ch.close() ,它会在确认上一条消息后继续拉取消息。
使用 docker RabbitMQ 实例我已经设置了这段代码(有效)但我很好奇 open/closing 通道是否是执行此操作的最佳方式:
amqp.connect('amqp://guest:guest@localhost', (err, conn) => {
conn.createChannel((err, ch) => {
if (err) {
console.error(err);
} else {
let q = 'my queue';
ch.prefetch(1);
ch.consume(q, data => {
console.log(data.content.toString());
ch.ack(data);
ch.close();
returnData = data;
});
}
});
});
您可以一次拉取一条消息,使用 channel.get(参见 http://www.squaremobius.net/amqp.node/channel_api.html#channel_get),我发现这很有用,而不是使用消耗(即使使用预取)。为此,您也可以使用长期存在的频道。
var amqpChannel = null;
amqp.connect('amqp://guest:guest@localhost', (err, conn) => {
conn.createChannel((err, ch) => {
if (err) {
console.error(err);
} else {
amqpChannel = ch;
}
});
});
var readMessageFromQueue = function() {
if (amqpChannel) {
amqpChannel.get(q, data => {
// data will be set to false if no messages are available on the queue.
if (data) {
console.log(data.content.toString());
amqpChannel.ack(data);
}
});
}
}
// Whatever interval you like..
setInterval(readMessageFromQueue, 1000);
我正在尝试从 rabbitmq 中提取一条消息,对其进行处理,然后确认该消息。我不希望它在确认从队列中拉出消息后继续。如果我不在下面的代码中执行 ch.close() ,它会在确认上一条消息后继续拉取消息。
使用 docker RabbitMQ 实例我已经设置了这段代码(有效)但我很好奇 open/closing 通道是否是执行此操作的最佳方式:
amqp.connect('amqp://guest:guest@localhost', (err, conn) => {
conn.createChannel((err, ch) => {
if (err) {
console.error(err);
} else {
let q = 'my queue';
ch.prefetch(1);
ch.consume(q, data => {
console.log(data.content.toString());
ch.ack(data);
ch.close();
returnData = data;
});
}
});
});
您可以一次拉取一条消息,使用 channel.get(参见 http://www.squaremobius.net/amqp.node/channel_api.html#channel_get),我发现这很有用,而不是使用消耗(即使使用预取)。为此,您也可以使用长期存在的频道。
var amqpChannel = null;
amqp.connect('amqp://guest:guest@localhost', (err, conn) => {
conn.createChannel((err, ch) => {
if (err) {
console.error(err);
} else {
amqpChannel = ch;
}
});
});
var readMessageFromQueue = function() {
if (amqpChannel) {
amqpChannel.get(q, data => {
// data will be set to false if no messages are available on the queue.
if (data) {
console.log(data.content.toString());
amqpChannel.ack(data);
}
});
}
}
// Whatever interval you like..
setInterval(readMessageFromQueue, 1000);