Мы используем клиентскую библиотеку 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 указано, что можно изменить значение тайм-аута. Однако это не решит проблему, поскольку Flux все равно будет завершаться, хотя и с другой частотой.
Я также нашел открытую проблему в файле реактора-rabbitmq. , который решает общую проблему: неясно, как оставить потребителя открытым после создания исключения.
Подробнее здесь: https://stackoverflow.com/questions/791 ... nt-timeout
Мобильная версия