如何在消息发送后立即从 RabbitMQ 中的队列中删除消息
how to delete messages from a Queue in RabbitMQ immediately after they ve been sent
所以我开始使用 RabbitMQ 并在网站上做教程 https://www.rabbitmq.com/tutorials/tutorial-one-javascript.html 但我没有 100% 理解如何设置知识功能以便队列在发送消息后立即删除消息,消息是否被消费并不重要。我正在尝试创建一个队列,该队列将在发送后立即删除所有消息
我尝试了教程中的示例,例如 hello world 示例显示 noAck 属性 设置为 true,这意味着我们没有确认消息,因此队列应该在它们确认后实际删除这些消息已发送但事实并非如此,因为当我 运行 send.js 3 次然后 运行 receive.js 然后我将收到 3 次你好世界消息,这不是我想要的
// this is send.js
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function(error0, connection) {
if (error0) {
throw error0;
}
connection.createChannel(function(error1, channel) {
if (error1) {
throw error1;
}
var queue = 'hello';
var msg = 'Hello World!';
channel.assertQueue(queue, {
durable: false
});
channel.sendToQueue(queue, Buffer.from(msg));
console.log(" [x] Sent %s", msg);
});
setTimeout(function() {
connection.close();
process.exit(0);
}, 500);
});
// this is receive .js
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function(error0, connection) {
if (error0) {
throw error0;
}
connection.createChannel(function(error1, channel) {
if (error1) {
throw error1;
}
var queue = 'hello';
channel.assertQueue(queue, {
durable: false
});
console.log(" [*] Waiting for messages in %s. To exit press CTRL+C",
queue);
channel.consume(queue, function(msg) {
console.log(" [x] Received %s", msg.content.toString());
}, {
noAck: true
});
});
});
例如,如果我 运行 3 次 send.js,则可能会发生 2 种情况。情况 1 是消息将从接收方消费并完成。 case2 是它不会被接收者消耗,在这种情况下我希望它被删除我不希望消息被消耗如果我 运行 receive.js 从 send.js 一个月后,但我也希望我的队列持久且不排他。
当我继续调用 send.js 并且消息将一直推送到该队列中时,这也是一个问题,然后如果我 运行 receive.js 我将同时收到 1000 条消息所以我的目标是避免这种情况。
感谢您的帮助
我认为您想要的是,在再次阅读评论和问题之后,您希望将消息传递给消费者,或者如果不能传递则丢弃在它到达队列的那一刻被交付。如果是这种情况,您可以将队列或单个消息的 TTL 设置为 0。来自documentation的相关部分:
Setting the TTL to 0 causes messages to be expired upon reaching a queue unless they can be delivered to a consumer immediately.
要设置队列的 TTL,对于 JavaScript 客户端,您需要修改对 channel.assertQueue
的调用以包含 arguments
和 x-message-ttl
集到 0。这是相关部分的示例:
var queue = 'hello';
channel.assertQueue(queue, {
durable: false,
arguments: {
"x-message-ttl": 0
}
});
有关更多详细信息,请参阅 amqp.node
documentation。
所以我开始使用 RabbitMQ 并在网站上做教程 https://www.rabbitmq.com/tutorials/tutorial-one-javascript.html 但我没有 100% 理解如何设置知识功能以便队列在发送消息后立即删除消息,消息是否被消费并不重要。我正在尝试创建一个队列,该队列将在发送后立即删除所有消息
我尝试了教程中的示例,例如 hello world 示例显示 noAck 属性 设置为 true,这意味着我们没有确认消息,因此队列应该在它们确认后实际删除这些消息已发送但事实并非如此,因为当我 运行 send.js 3 次然后 运行 receive.js 然后我将收到 3 次你好世界消息,这不是我想要的
// this is send.js
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function(error0, connection) {
if (error0) {
throw error0;
}
connection.createChannel(function(error1, channel) {
if (error1) {
throw error1;
}
var queue = 'hello';
var msg = 'Hello World!';
channel.assertQueue(queue, {
durable: false
});
channel.sendToQueue(queue, Buffer.from(msg));
console.log(" [x] Sent %s", msg);
});
setTimeout(function() {
connection.close();
process.exit(0);
}, 500);
});
// this is receive .js
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function(error0, connection) {
if (error0) {
throw error0;
}
connection.createChannel(function(error1, channel) {
if (error1) {
throw error1;
}
var queue = 'hello';
channel.assertQueue(queue, {
durable: false
});
console.log(" [*] Waiting for messages in %s. To exit press CTRL+C",
queue);
channel.consume(queue, function(msg) {
console.log(" [x] Received %s", msg.content.toString());
}, {
noAck: true
});
});
});
例如,如果我 运行 3 次 send.js,则可能会发生 2 种情况。情况 1 是消息将从接收方消费并完成。 case2 是它不会被接收者消耗,在这种情况下我希望它被删除我不希望消息被消耗如果我 运行 receive.js 从 send.js 一个月后,但我也希望我的队列持久且不排他。 当我继续调用 send.js 并且消息将一直推送到该队列中时,这也是一个问题,然后如果我 运行 receive.js 我将同时收到 1000 条消息所以我的目标是避免这种情况。 感谢您的帮助
我认为您想要的是,在再次阅读评论和问题之后,您希望将消息传递给消费者,或者如果不能传递则丢弃在它到达队列的那一刻被交付。如果是这种情况,您可以将队列或单个消息的 TTL 设置为 0。来自documentation的相关部分:
Setting the TTL to 0 causes messages to be expired upon reaching a queue unless they can be delivered to a consumer immediately.
要设置队列的 TTL,对于 JavaScript 客户端,您需要修改对 channel.assertQueue
的调用以包含 arguments
和 x-message-ttl
集到 0。这是相关部分的示例:
var queue = 'hello';
channel.assertQueue(queue, {
durable: false,
arguments: {
"x-message-ttl": 0
}
});
有关更多详细信息,请参阅 amqp.node
documentation。