Поведение по умолчанию для пакета Spring заключается в обработке следующего элемента только после завершения первого элемента? - PullRequest
0 голосов
/ 17 декабря 2018

После прочтения этой статьи о возможностях масштабирования и параллельной обработки в Spring-Batch нам стало интересно, каково стандартное поведение Spring-batch?

Допустим, у нашей работы есть читатель, 5 шагов и писатель.

Будет ли Spring-batch читать один элемент, проходить его через все 5 шагов, записывать его и только потом переходить к следующему элементу?Что-то вроде гиганта for loop?

Или есть некоторый параллелизм, поэтому, пока элемент A перемещается на шаг 2, элемент B читается и обрабатывается на шаг 1?

1 Ответ

0 голосов
/ 17 декабря 2018

Я думаю, вы неправильно понимаете, как работает Spring Batch.Позвольте мне начать с этого, а затем перейти к параллелизму.

Шаг на основе чанка в Spring Batch состоит из ItemReader, необязательного ItemProcessor, а затем ItemWriter.Каждый из них, очевидно, поддерживает композицию (Spring Batch предоставляет некоторые компоненты для использования композиции в фазах ItemProcessor и ItemWriter).На этом этапе Spring Batch читает элементы до тех пор, пока не будет выполнено заданное условие (обычно размер куска).Затем этот список повторяется, передавая каждый элемент в ItemProcessor.Наконец, список всех результатов вызовов ItemProcessor передается в ItemWriter за один вызов.Идея прочитать один раз, затем сделать несколько шагов, а затем написать совсем не так, как работает Spring Batch.Наиболее близким мы получим один ItemReader, затем с помощью композиции создадим цепочку ItemProcessor вызовов, затем один вызов ItemWriter.

. С учетом сказанного Spring Batch предоставляетколичество вариантов параллелизма.Существует пять различных вариантов масштабирования заданий Spring Batch.Я не буду вдаваться в подробности о каждом из них, потому что это выходит за рамки этого и четко обсуждается в других вопросах StackOverflow, а также в документации.Однако список выглядит следующим образом:

  1. Многопоточные шаги - Здесь каждый кусок (блок элементов, обрабатываемых в транзакции) выполняется в отдельном потоке с использованием абстракции Spring * TaskExecutor..
  2. Параллельные шаги - Здесь пакетное задание снова выполняет несколько независимых шагов параллельно, используя абстракцию Spring TaskExecutor для управления используемыми тегами.
  3. AsyncItemProcessor/ AsyncItemWriter - Здесь каждый вызов ItemProcessor вызывается в своем собственном потоке.Полученный Future передается в AsyncItemWriter, который разворачивает Future и результаты сохраняются.
  4. Секционирование - Spring Batch позволяет разбить набор данных на несколько секцийкоторые затем выполняются параллельно либо через локальные механизмы потоков, либо удаленно.
  5. Удаленное разбиение на блоки - Последний вариант заключается в том, чтобы мастер считывал данные, а затем отправлял их пулу рабочих дляобработка и запись.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...