Как подтвердить сообщение в Rabbitmq на другом канале - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть запрос на подтверждение потребителя RabbitMq, я прочитал документацию на RabbitMq, в которой говорится, что подтверждение сообщения должно быть на том же канале, от которого получатель получил.Но я нахожусь в ситуации, когда по какой-то причине процесс потребителя останавливается после того, как я получил сообщение и не подтвердил Rabbitmq, когда процесс потребителя перезапускается, потребитель начинает получать неподтвержденные сообщения от RabbitMq, но здесь потребитель не может отправить подтверждениек этим сообщениям, когда я получаю исключение канала, заявляющее, что тег не принадлежит каналу.Итак, мой вопрос заключается в том, как справиться с этим сценарием и как я могу подтвердить, что rabbitmq удалит сообщение после того, как мой потребительский процесс завершит чтение сообщения?

1 Ответ

0 голосов
/ 22 ноября 2018

Как вы сказали подтверждение должно быть отправлено по тому же каналу

Подтверждение должно быть отправлено по тому же каналу, для которого была получена доставка.Попытки подтвердить использование другого канала приведут к исключению протокола уровня канала

Простой способ сделать это - использовать autoack=true, поэтому сообщение будет автоматически подтверждено после его использования.

boolean autoAck = true; // acknowledgment is covered below
channel.basicConsume(TASK_QUEUE_NAME, autoAck, consumer);

РЕДАКТИРОВАТЬ

, если auto_ack не работает для вас, вы можете использовать channel_consumer.basicCancel(consumerTag);

что-то вроде этого:

   final Consumer consumer = new DefaultConsumer(channel_consumer) {
        @Override
        public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
          String message = new String(body, "UTF-8");

          System.out.println(" [x] Received '" + message + "'");
          try {
            channel_consumer.basicCancel(consumerTag);
            System.out.println(" [x] stopping" + message + "'");

            try {
              Thread.sleep(10000);
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
            System.out.println(" [x]  elaborated getting ack" + message + "'");
            channel_consumer.basicAck(envelope.getDeliveryTag(), false);

          } finally {
            System.out.println(" [x] Done");
          }
        }
      };
      boolean autoAck = false; // acknowledgment is covered below
      channel_consumer.basicConsume("test", autoAck, consumer);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...