Spring Batch - отключить кэш ItemReader при пропуске процессора и снова обработать отфильтрованные строки - PullRequest
1 голос
/ 24 апреля 2020

Я уже некоторое время использую Spring Batch, и сегодня я попытался улучшить свои партии, чтобы сделать их более пуленепробиваемыми. Поэтому я включил .faultTolerant и .skipLimit / .skip, но не включил ни одной стратегии повторения.

Почти во всех моих пакетах есть 1 считыватель (JpaPagingItemReader для чтения данных из моей базы данных), 1 процессор и 1 писатель для создания XML файлов. Все эти 3 части находятся в одном шаге, и мой размер чанка обычно составляет около 50.

Я заметил два побочных эффекта, когда возникает исключение с возможностью пропуска, и я хотел бы знать, есть ли способ изменить эти значения по умолчанию поведения =>

  1. Я обычно читаю сущности JPA в своем ридере, отправляю их на свой процессор, где я изменяю их свойства для обновления своей базы данных. Но когда возникает пропускаемое исключение, и объекты снова обрабатываются, они становятся отсоединенными объектами, и они больше не соответствуют базе данных, потому что их состояние было обновлено в предыдущем процессе, пока база данных была откатана. Я понимаю, что результаты читателя кэшируются, и что в документации говорится, что результат ItemReader должен оставаться «идемпотентным» (не измененным). Но есть ли способ отключить кэш ItemReader и принудительно загрузить объект fre sh при повторной обработке элемента? Это больше подходит для моего варианта использования.
  2. Я заметил, что когда элемент фильтруется (процессор возвращает ноль), а затем возникает исключение с возможностью пропуска, фильтрованные элементы не обрабатываются снова после отката. Есть ли способ изменить это?

Прежде чем задавать этот вопрос, я много искал по stackoverflow, документации по пакетным ресурсам и в Google, но не смог найти ответ.

Заранее благодарен за вашу драгоценную помощь И большое спасибо разработчикам Spring Batch за этот замечательный инструмент!

1 Ответ

1 голос
/ 28 апреля 2020
  1. Но есть ли способ отключить кэш ItemReader

readerTransactionalQueue - это то, что вы ищете (несмотря на " queue "в названии, которое не относится к вашему делу, но все же, это то, что отключает кэш).

Я заметил, что когда элемент фильтруется (процессор возвращает ноль), а затем возникает исключение с возможностью пропуска, фильтрованные элементы не обрабатываются снова после отката. Есть ли способ изменить это?

Я не вижу очевидного способа изменить это. Это как это работает с самого начала, я думаю (глядя на дату последней модификации). Но это имеет смысл для меня, зачем кому-то повторно обрабатывать элемент, если он был отфильтрован? В любом случае этот элемент будет повторно отфильтрован, если процессор не является идемпотентом, что не рекомендуется .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...