Spring Batch пропускает элементы во время процесса и регистрирует пропущенный элемент в БД, а затем снова записывает данные в БД - PullRequest
0 голосов
/ 29 октября 2018

Я новичок в пакете Spring с весенней загрузкой и прочитал почти все возможные доступные статьи, но не нашел точных сценариев / фрагментов для варианта использования, как показано ниже.

  1. Чтение данных из БД (например: 5 элементов)
  2. Обработка данных: вызов API и , если вызов API Fails пропускает элемент и обрабатывает следующий элемент. (Для всех 5 элементов в последовательности)
  3. Все пропущенные элементы должны быть зарегистрированы в дБ
  4. После обработки всех 5 элементов со сценарием сбой / успех, затем повторите попытку через некоторое время.

Я использовал RetryTemplate, но там он сразу же пытается выполнить исключение, поэтому он не работает для меня.

Я создал политику пропуска, которая пропускает исключение и дает мне ожидаемое поведение, но не может запустить попытки повторной попытки (3) таким же образом.

Может кто-нибудь помочь с некоторыми примерами и привести меня к тому же ...

1 Ответ

0 голосов
/ 29 октября 2018

После обработки всех 5 элементов со сценарием неудачи / успеха, затем повторите попытку через некоторое время

Функции отказоустойчивости (пропуск и повтор) выполняются для элементов внутри фрагмента, а не для всего фрагмента. Таким образом, невозможно обработать все элементы (где некоторые из них могут потерпеть неудачу), , а затем после обработки всего фрагмента, повторите неудачные. При указании политики повтора эта политика будет применяться к элементам, а не ко всему куску.

Я использовал RetryTemplate, но там он сразу же пытается исключить элемент

Вы можете установить BackoffPolicy в шаблоне повторных попыток, и между каждой попыткой повторения будет период задержки (вместо немедленной повторной попытки). Но опять же, эта политика будет применяться для повторяющегося элемента, а не для всего фрагмента.

Один из методов, который вы можете использовать (поскольку входные данные являются таблицей базы данных), представляет собой вариант «шаблона индикатора процесса» (показан в этом примере ). Идея состоит в том, чтобы использовать флаг, чтобы указать записи для обработки. Ваша работа должна читать только те записи, которые нужно обработать, помечать успешные записи как обработанные (обновить флаг) и пропущенные как необработанные (или просто не обновлять флаг, поскольку по умолчанию установлено значение false). Таким образом, пропущенные записи будут частью ввода следующего запуска задания и будут повторены по проекту.

Надеюсь, это поможет.

...