Spring Batch - возврат к любому предыдущему шагу на основе условия - PullRequest
0 голосов
/ 28 февраля 2020

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

У меня есть задание с шагом и двумя потоками:

Шаг 1:

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

Поток 1 :

Этот поток имеет шаг (Reader, Processor, Writer), чей Читатель выберет этот номер контракта и получит список идентификаторов участников. Эти идентификаторы будут передаваться процессору частями (из 10).

Процессор дополнительно выполнит несколько вызовов Query, чтобы, наконец, создать список сведений об участнике для средства записи. Автор записывает эти данные частями в объект «Рабочая книга».

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

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

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

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

Diagrammati c представление вышеприведенного объяснения

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

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)

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

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

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

1 Ответ

0 голосов
/ 05 марта 2020

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

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

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

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

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