Sobes.tech
Назад к вопросам
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. Это позволяет контролировать момент подтверждения и избежать потери сообщений.