как удалить сообщения из очереди в RabbitMQ сразу после их отправки - PullRequest
0 голосов
/ 23 апреля 2019

Итак, я начал использовать 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 сообщений одновременно, поэтому моя цель состоит в том, чтобы этого избежать. Я ценю любую помощь

1 Ответ

0 голосов
/ 24 апреля 2019

То, что я думаю , что вы хотите, после прочтения комментариев и повторного вопроса, заключается в том, что вы хотите, чтобы сообщение было либо доставлено потребителю, либо отброшено, если оно не может быть доставлено в тот момент, когда оно попадает в очередь. Если это так, вы можете установить TTL на 0, либо в очереди, либо в отдельных сообщениях. Из соответствующей части документации :

Установка TTL в 0 приводит к истечению срока действия сообщений при достижении очереди, если только они не могут быть немедленно доставлены потребителю.

Чтобы установить TTL очереди, в вашем случае клиента JavaScript вам нужно изменить вызов на channel.assertQueue, чтобы включить arguments с x-message-ttl, установленным в 0. Вот пример соответствующей части:

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

Для получения более подробной информации см. Документацию amqp.node .

...