Назад к вопросам
СБЕР
Senior
6
Как настроили логику чтения из Dead Letter Queue и где делается ack (manual acknowledgement)?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Для чтения из Dead Letter Queue (DLQ) в Java обычно настраивают отдельный consumer, который подписывается на очередь ошибок. Логика заключается в том, чтобы обрабатывать сообщения, которые не удалось обработать в основной очереди, и принимать решение — повторить попытку, логировать или игнорировать.
Manual acknowledgement (ручное подтверждение) делается после успешной обработки сообщения из DLQ, чтобы гарантировать, что сообщение не будет потеряно и не будет повторно доставлено без необходимости.
Пример с использованием Spring AMQP:
@RabbitListener(queues = "dead_letter_queue")
public void processDeadLetter(Message message, Channel channel) throws IOException {
try {
// Обработка сообщения
String body = new String(message.getBody(), StandardCharsets.UTF_8);
// логика обработки
// Подтверждаем успешную обработку
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
// В случае ошибки можно сделать nack с requeue=false, чтобы не зациклить сообщение
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
// Логируем ошибку
}
}
Здесь basicAck вызывается вручную после успешной обработки, что и есть manual acknowledgement. Это позволяет контролировать момент подтверждения и избежать потери сообщений.