#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
, вызов очереди возвращает мне только одно сообщение и очищает очередь.