Как реализовать отложенные повторы для потребителя Java RabbitMQ без блокировки канала?JAVA

Программисты JAVA общаются здесь
Anonymous
Как реализовать отложенные повторы для потребителя Java RabbitMQ без блокировки канала?

Сообщение Anonymous »

Я использую официальный amqp-клиент RabbitMQ на Java для обработки сообщений и отправки их во внешний REST API. В настоящее время у меня отключен autoAck, и я обрабатываю сбои, вызывая BasicNack с requeue = true.
Проблема: Когда внешний API не работает, requeue = true приводит к немедленной повторной доставке сообщения. Это создает бесконечный цикл, который потребляет большую нагрузку на процессор и заполняет мои журналы ошибками подключения, поскольку между повторными попытками нет задержки.

Код: Выделить всё

// Simplified logic
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
long deliveryTag = delivery.getEnvelope().getDeliveryTag();
try {
// ... JSON parsing and API call ...
if (response.statusCode() == 200) {
channel.basicAck(deliveryTag, false);
} else {
// This causes immediate redelivery loop
channel.basicNack(deliveryTag, false, true);
}
} catch (Exception e) {
channel.basicNack(deliveryTag, false, true);
}
};
Что я рассмотрел:
  • Использование Thread.sleep(): я хочу избежать этого, поскольку оно блокирует канал/соединение для других сообщений.
  • Spring RabbitMQ: я ищу решение с использованием родного Java-клиента без переноса всего проекта на Spring.
Вопрос: Как я могу реализовать механизм повтора с задержкой (например, экспоненциальной отсрочкой) или переместить сообщение в очередь «ожидания», используя TTL и обмен недоставленными письмами (DLX), используя библиотеку amqp-client? Будем признательны за любой пример кода или шаблон для корректной обработки простоев внешнего API.

Вернуться в «JAVA»