繁体   English   中英

如何在发送后立即从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%了解如何设置aknowledge功能以便队列将删除消息发送后立即发送消息,消息是否消耗无关紧要。 我正在尝试创建一个队列,它将在发送后立即删除所有消息

我尝试了教程中的示例,例如,hello world示例显示noAck属性设置为true,这意味着我们不会确认消息,因此Queue应该在发送后实际删除这些消息,但事实并非如此,我运行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是它不会从接收器消耗,在这种情况下我希望它被删除我不希望消息被消耗,如果我在send.js一个月后运行receive.js,但我也想我的队列耐用而不是独家。 当我继续调用send.js时,它也会成为一个问题,并且会在该队列中一直推送消息,然后如果我运行receive.js,我会同时收到1000条消息,所以我的目标是避免这种情况。 我感谢任何帮助

在您再次阅读评论和问题之后,我认为您想要的是,您希望将消息传递给消费者,或者如果消息在到达队列时无法传递,则丢弃该消息。 如果是这种情况,您可以在队列或单个消息上将TTL设置为0。 从相关的部分文件

将TTL设置为0会导致消息在到达队列时过期,除非它们可以立即传递给消费者。

要设置队列的TTL,在JavaScript客户端的情况下,你需要修改调用channel.assertQueue以包括argumentsx-message-ttl设置为0以下是相关部分的例子:

var queue = 'hello';
channel.assertQueue(queue, {
    durable: false,
    arguments: {
        "x-message-ttl": 0
    }
});

有关更多详细信息,请参阅amqp.node文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM