Я новичок в 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)
Мои проблемы начинаются здесь:
- Как мне вернуться из потока 2 обратно к шагу 1 в зависимости от условия? Я нашел несколько предложений, в которых люди добавляют цикл принятия решения, но вы можете вернуться к предыдущему шагу (в этом случае условие не выполняется в потоке 2, поток 2 будет запущен повторно). Итак, как мне вернуться с потока 2 к Шагу 1?
- Как передать данные между всеми этапами и потоками на протяжении всего задания? (без использования контекста выполнения)
Если вы думаете, что есть лучший способ сделать это, пожалуйста, предложите.