Мы используем клиентскую библиотеку Reactor RabbitMQ, настроенную с помощью ConsumerManualAck. Время от времени в наших журналах мы наблюдаем следующую ошибку:
c.r.c.ShutdownSignalException: ошибка канала; метод протокола: #method(reply-code=406, report-text=PRECONDITION_FAILED — истекло время ожидания подтверждения доставки на канале 5. Используемое значение таймаута: 1800000 мс. Это значение таймаута можно настроить, см. руководство по документации для потребителей. узнайте м...
После этого заявления (предположительно зарегистрированного этим утверждением) канал немедленно отключается, Reactive Flux завершается и, следовательно, обработка сообщений прекращается.
Клиент был настроен с обработчиком исключений повторной попытки в попытке уменьшить количество сбоев соединения:
Код: Выделить всё
Receiver receiver = RabbitFlux.createReceiver();
ConsumeOptions consumeOptions = new ConsumeOptions()
.exceptionHandler(new ExceptionHandlers.RetryAcknowledgmentExceptionHandler(
Duration.ofSeconds(10),
Duration.ofMillis(200),
ExceptionHandlers.CONNECTION_RECOVERY_PREDICATE
));
receiver.consumeManualAck("queue_name", consumeOptions)
.subscribe(delivery -> {
// message processing omitted
// acknowledge message
delivery.ack();
});
В поисках решения в этом ответе SO говорится, что можно изменить значение таймаута. Однако это не решит проблему, поскольку поток все равно будет отключаться, хотя и с другой частотой.
Подробнее здесь: https://stackoverflow.com/questions/791 ... nt-timeout
Мобильная версия