Spring Batch - возврат к любому предыдущему шагу в зависимости от условия

Я новичок в Spring Batch, и у меня возникла проблема, решения которой я не нашел.

Я создал задание, в котором есть шаг и два потока:

Шаг 1:

Получает список номеров контрактов (для упрощения уникальный номер, который будет использоваться для поиска в дальнейших записях). Используя отдельный фрагмент ItemReader, он передаст один номер контракта следующему шагу.

Поток 1:

В этом потоке есть Шаг (Читатель, Процессор, Писатель), Читатель которого выберет этот номер контракта и получит список идентификаторов участников. Эти идентификаторы будут переданы процессору блоками (по 10 штук).

Далее процессор выполнит несколько вызовов Query, чтобы окончательно создать для автора список сведений об участниках. Писатель запишет эти данные по частям в объект Workbook.

Поток 2: после того, как все данные записаны в книгу, объект отправляется в виде файла в удаленное место. Этот процесс выполняется с помощью тасклета, в котором есть все необходимые данные для отправки файла в предложенное место назначения.

Теперь, когда весь этот процесс завершен (Шаг 1-> Поток 1-> Поток 2), он проверяет, нужно ли записывать какие-либо дополнительные детали контракта в удаленное место.

Если да, другой номер контракта извлекается из списка, который затем передается потокам (поток1 и поток2). После обработки всех номеров контрактов код завершается с RepeatStatus.FINISHED

Добавляем диаграмму для лучшего понимания:

Схематическое изображение приведенного выше объяснения

Выглядит это примерно так:

Job
-> Step 1 (retrieve Id number list but send a single contract number)
   -> Flow 1
      -> Reader
      -> Processor
      -> Writer
   -> Flow 2 
      -> Tasklet (Send file to remote location)
   (If all contract-numbers are not processed go to Step 1 and iterate to the next contract-number else finish the job)

Мои проблемы начинаются здесь:

  1. Как мне вернуться из потока 2 обратно к шагу 1 в зависимости от условия? Я нашел несколько предложений, в которых люди добавляют цикл принятия решения, но вы можете вернуться к предыдущему шагу (в этом случае условие не выполняется в потоке 2, поток 2 будет запущен повторно). Итак, как мне вернуться с потока 2 к Шагу 1?
  2. Как передать данные между всеми этапами и потоками на протяжении всего задания? (без использования контекста выполнения)

Если вы думаете, что есть лучший способ сделать это, пожалуйста, предложите.


person Julia Byers    schedule 28.02.2020    source источник
comment
Ваш исходный набор входных данных фиксирован или может измениться во время выполнения задания?   -  person Mahmoud Ben Hassine    schedule 03.03.2020
comment
Как только задание начнется и я получу свой ввод, он останется прежним. Однако это будет список входных данных, которые необходимо повторять один за другим в рамках задания.   -  person Julia Byers    schedule 05.03.2020


Ответы (1)


Как мне вернуться из потока 2 обратно к шагу 1 в зависимости от условия?

Используйте JobExecutionDecider за это. Вы должны убедиться, что шаг 1 разрешен для перезапуска, даже если он завершен (параметр allowStartIfComplete=true)

Как передать данные между всеми этапами и потоками на протяжении всего задания? (без использования контекста выполнения)

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

person Mahmoud Ben Hassine    schedule 05.03.2020
comment
Спасибо за решение. Но я пытался понять это и, пожалуйста, поправьте меня, если я ошибаюсь. Скажем, у меня есть 3 шага Шаг 1 - Шаг 2 - Шаг 3. Я применяю JobExecutionDecider после шага 1. Затем он будет повторять шаг 1, пока условие, которое я поставил в JobExecutionDecider, не будет удовлетворено, и в этом случае он перейдет к следующему. шаг. Но в моем случае использования я не только должен пройти через шаги в обратном направлении, но и должен перейти к начальному шагу. Итак, в моем примере, исходя из условия, я должен вернуться от шага 3 обратно к шагу 1. И вход для этого решающего элемента находится на шаге 1. - person Julia Byers; 09.03.2020
comment
Поместите данные, необходимые для принятия решения, в контекст выполнения задания на шаге 1. Когда поток достигает шага 3, принимающее решение может прочитать данные из контекста и принять решение вернуться к шагу 1 или нет. - person Mahmoud Ben Hassine; 09.03.2020
comment
Верно, что лицо, принимающее решение, сможет принять решение, завершить задание или вернуться к шагу 1 (он вернет статус, который поможет в принятии решения). Но как я могу позвонить на Шаг 1 из Шага 3? Как мне вернуться к шагу 1 после принятия решения? (И он следует тому же самому шагу 1 - ›Шаг 2 -› Шаг 3) Я не смог найти пример, в котором прямые вызовы шагов были сделаны из метода. Не могли бы вы предоставить ссылку или код, по которому такие вызовы выполняются в Steps? - person Julia Byers; 10.03.2020