Работаем над загрузочным приложением Spring, где оно слушает тему Kafka, обрабатывает ее и вставляет в БД. В настоящее время мы вручную подтверждаем сообщения и используем пакетный прослушиватель как «истина». Мы получаем пакет из 500 сообщений один раз для обработки, используя «цикл for» для обработки каждого сообщения и помещения в БД, а затем подтверждения сообщения в Kafka.
Я использовал «ExponentialBackOff» для повторных попыток, например, если БД не работает, текущее сообщение из 500 сообщений, следует попытаться выполнить «N» количество раз и, наконец, перейти к «CommonErrorHandler» и зарегистрировать сообщение.
Проблема здесь в том,
Если есть любая ошибка в 500-м событии, снова вся партия из 500 пытается повторно обработать, что неприемлемо.
Чтобы решить эту проблему, начал выдавать «BatchListenerFailedException» с индексом вместо Just "Исключение". Но это создает другую проблему: он не пытается N раз выполнить попытку, как только управление переходит к блоку перехвата с «BatchListenerFailedException», он переходит к общему обработчику ошибок и пропускает событие.
Другая проблема заключается в том, что из 500 записей, если 101-я запись дает сбой, снова обрабатываются 500 записей с самого начала, когда мы вызываем отсрочку, хотя мы уже подтвердили первые 100 сообщений. Как я могу это исправить?
Примечание. Я где-то читал, что, хотя мы указываем «Вручную» или «Немедленно вручную», пакет зафиксирует подтверждение после завершения всех сообщений. Пожалуйста, исправьте.
for(int i=0;i
Подробнее здесь: https://stackoverflow.com/questions/787 ... h-listener