#apache-kafka #spring-kafka
Вопрос:
Мне трудно разобраться в ролях и обязанностях KafkaListenerErrorHandler и ErrorHandler. Вот мое понимание каждого из них до сих пор. Пожалуйста, поправьте меня, если я ошибаюсь.
Предположение: Использование конфигурации Spring Kafka по умолчанию из коробки.
KafkaListenerErrorHandler
- Этот обработчик вызывается всякий раз, когда возникает исключение в методе с аннотацией @KafkaListener. Согласно документации, это происходит на уровне слушателя.
Устройство для обработки ошибок
- Этот обработчик вызывается всякий раз, когда на уровне контейнера возникает исключение. Это зафиксирует смещение (так как по умолчанию isAckAfterHandle() возвращает значение true) после обработки ошибки (которая является просто сообщением журнала).
Мои заблуждения
- Почему существует отдельный обработчик ошибок kafkalistenererror, если у нас уже есть обработчик ошибок на уровне контейнера, а прослушиватель принадлежит контейнеру?
- Означает ли это, что когда мы используем аннотацию @KafkaListener, ошибка никогда не обрабатывается обработчиком ошибок на уровне контейнера, а обрабатывается обработчиком ошибок KafkaListener на уровне прослушивателя?
- Если обработчик ошибок на уровне контейнера никогда не вызывается при использовании аннотации @KafkaListener, то как фиксируются смещения? Ответственен ли за это KafkaListenerErrorHandler? Сколько раз KafkaListenerErrorHandler повторит неудачное сообщение?
- Как работает повторная попытка/восстановление для KafkaListenerErrorHandler?
Ответ №1:
В KafkaListenerErrorHandler
основном он используется для сценариев запроса/ответа — он позволяет отправлять вызывающему абоненту некоторое указание на ошибку в качестве результата, но возвращать некоторое значение.
Его также можно использовать, например, для регистрации преобразованного Messagelt;?gt;
и повторного создания исключения, чтобы обработчик ошибок контейнера (который теперь по умолчанию равен a SeekToCurrentErrorHandler
) мог обработать исключение. Обработчик ошибок контейнера не имеет доступа к преобразованному сообщению.
Если обработчик ошибок прослушивателя не повторяет исключение, повторная попытка отменяется.
Повторная попытка в адаптере устарела в пользу обработчика ошибок контейнера, потому что теперь SeekToCurrentErrorHandler
поддержка отключена, классификация исключений и т. Д.
Комментарии:
1. Означает ли это, что если KafkaListenerErrorHandler не вернет исключение обратно в контейнер, то смещение будет зафиксировано, и следующее сообщение в теме будет получено методом с аннотацией @KafkaListener?
2. Да, это верно.
3. Спасибо за ответ. Следующий вопрос заключается в том, создает ли конфигурация Spring из коробки исключение через KafkaListenerErrorHandler, когда возникает ошибка при обработке сообщения от метода с аннотацией @KafkaListener? В моей голове это должно быть так, так как я определенно видел повторные попытки, происходящие в журналах, и, как вы сказали, повторных попыток не может быть, если обработчик ошибок прослушивателя не создает исключения.
4. По умолчанию обработчик ошибок прослушивателя отсутствует, поэтому любое исключение, создаваемое прослушивателем, передается в контейнер.
5. Означает ли это, что для предоставления обработчика ошибок прослушивателя для прослушивателя с аннотацией @KafkaListener мы должны настроить обработчик ошибок KafkaListener, поскольку по умолчанию обработчик ошибок прослушивателя отсутствует?