Есть ли способ предотвратить двойную обработку партии одного и того же фрагмента/элемента при пропуске?

В моем конкретном сценарии мне приходится сохранять огромные объекты, считываемые из файлов, в базу данных, но мой интервал фиксации настроен на value = 1. Также я не совсем уверен, что процессор делегата в используемом CompositeItemProcessor является идемпотентным. Итак, мой вопрос заключается в том, есть ли способ предотвратить потерю времени на повторную обработку и избежать многих неиспользуемых запросов к базе данных. Я также хочу использовать SkipListener для регистрации ошибок чтения/обработки/записи в определенную таблицу и подозреваю, что такая конфигурация (без повторной обработки) не соответствует этому.

Я использую весеннюю партию 2.1.9.

Заранее спасибо.

____________________________ОБНОВЛЕНИЕ 05.07.2016 ____________________________

После нескольких дней исследований я понял, что между некоторыми пользователями и разработчиками Spring ведутся концептуальные дебаты.

Теперь я знаю, что это поведение работает так, как задумано при пропущенных исключениях, возникающих на этапе написания, как сказал @MichaelMinella в комментарии к ответу в этом сообщение 2014 года:

Метод ItemWriter#write получает список элементов. Не просматривая их по одному, мы не сможем определить, какие из них в списке вызвали исключение в модуле записи.

Таким образом, платформа пока не может обнаружить сбойный элемент без сканирования всего списка (даже если размер фрагмента 1). Внутреннее поведение фреймворка для этого использует FaultTolerantChunkProcessor, а RetryTemplate описано в этот пост 2013 года более подробное обсуждение этого вопроса можно найти на этом сообщение на форуме весенней партии 2012.


person guilhermerama    schedule 22.06.2016    source источник


Ответы (1)


Если размер вашего фрагмента равен единице, элемент не должен обрабатываться несколько раз. Когда происходит пропуск, весенний пакет удаляет пропущенный элемент в чанке и повторно обрабатывает его. Когда фрагмент содержит только один элемент, не должно быть элементов, обработанных несколько раз.

person joshiste    schedule 22.06.2016
comment
Я тоже ожидал такого поведения @joshiste, но на практике фреймворк всегда повторно обрабатывает список, кэшированный при чтении, и обрабатывает мини-фрагменты для каждого элемента, чтобы узнать, какой элемент ответственен за ошибку, даже если этот список содержит только один элемент. Что я хочу знать, так это как переопределить это поведение или настроить пакет, чтобы пропустить эту дорогостоящую повторную попытку. Возможно, это невозможно, если я хочу использовать SkipCheckListener для регистрации ошибок при обработке. - person guilhermerama; 23.06.2016