Может ли кто-нибудь объяснить точное поведение канала RabbitMQ? а также, закрывает ли канал выполнение channel.basicAck?

#java #spring-boot #rabbitmq

#java #весенняя загрузка #rabbitmq

Вопрос:

Я пытаюсь выполнить операцию чтения очереди в очереди RabbitMQ с помощью channel.basicConsume() метода. Очередь содержит более одного сообщения, и когда я пытаюсь подтвердить каждое сообщение одно за другим, после подтверждения каждого сообщения в очереди канал закрывается channel.basicAck() методом. Это ожидаемое поведение канала?

для чтения более одного сообщения из очереди я использую следующий код. я переопределил handelDelivery() метод Consumer класса.

 ConnectionFactory connFactory = new ConnectionFactory();
Connection connection = connFactory.newConnection();
Channel channel = connection.createChannel();

channel.queueDeclare("sampleQueue", true, false, false, null);
channel.basicQos(1);

Consumer consumer = new DefaultConsumer(){
@Override
public void handleDelivery(String consumerTag, Envelopeenvelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
            String message = new String(body, "UTF-8");
            System.out.println(message);
            channel.basicAck(envelope.getDeliveryTag(), false);
            }

    };

 boolean autoAck = true;
 channel.basicConsume(queueName,autoAck,consumer);
  

Ответ №1:

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

из-за этого вызов basickAck выдает исключение, говорящее об отсутствии тега доставки для подтверждения (или он уже был подтвержден).

когда канал выдает исключение, он закрывается.

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

boolean autoAck = true;

к этому:

boolean autoAck = false;

Комментарии:

1. привет, Дерик, когда я меняю значение boolean autoAck = false , вызов очереди возвращает мне только одно сообщение и очищает очередь.