Пример пакетной обработки Spring

Привет, давайте взглянем на Spring Batch Processing.

Сначала давайте посмотрим, что такое пакетная обработка…

Пакетная обработка - это метод обработки данных большими группами (порциями), а не отдельным элементом данных. Это используется для обработки больших объемов данных и внесения любых изменений перед обработкой с минимальным вмешательством человека. Это дает много преимуществ при работе с большим объемом данных, таких как создание отчетов, системы анализа биллинга, анализ журналов и т. Д.



Это основная идея пакетной обработки. В этом посте мы рассмотрим весеннюю пакетную обработку.

Весенняя пакетная обработка

Пакет Spring - это среда пакетной обработки с открытым исходным кодом, предоставляемая Spring.

Облегченная комплексная пакетная среда, предназначенная для разработки надежных пакетных приложений, жизненно важных для повседневной работы корпоративных систем.



Как работает пакетная обработка… ..?

Выше представлена ​​основная структура пружинной партии. Это структурировано с учетом нормальной архитектуры пакетной обработки. Давайте посмотрим, как работает каждый из этих компонентов в весенней партии.

JobRepository - управляет процессом или состоянием Job и Step. Все данные управления хранятся в таблицах Spring Batch в базе данных, которые указаны в Spring Batch.

JobLauncher - простой интерфейс для запуска задания и всех возможных специальных операций. JobLauncher может напрямую использоваться пользователем. Но это не дает никаких гарантий относительно того, будет ли он выполняться синхронно или асинхронно. Это будет зависеть от реализации процесса.

Задание - единая исполнительная единица, которая определяет последовательность работы процесса. Job - это явная абстракция, которая представляет конфигурацию задания, указанную разработчиком.

Шаг - Шаг - это блок обработки задания. Задание может содержать один или несколько шагов в зависимости от определяемой нами логики, которую мы можем определить как модель фрагмента или модель тасклета. . Как и Job, Step предназначен для явного представления конфигурации шага разработчиком.

ItemReader, ItemProcessor, ItemWriter - ItemReader и ItemWriter - это компоненты, которые считывают и записывают данные, конвертируют данные и файлы в объекты Java и наоборот. И мы можем использовать ItemProcessor для обработки этих данных между чтением и записью, мы можем ввести любую бизнес-логику, преобразования данных и т. Д.

Это было основной предпосылкой того, как работает Spring Batch и его основные компоненты. Вы можете найти более подробную информацию в документации по весенней партии по ссылке ниже.



Начиная….

Теперь, когда у нас есть базовое представление о том, что такое пакетная обработка, давайте создадим образец приложения, чтобы увидеть, как работает пакетная обработка Spring. Для этого я воспользуюсь приложением для весенней загрузки. Для начала давайте создадим простое приложение для весенней загрузки, используя «SPRING INITIALIZR».



Теперь нам нужно добавить в наше приложение функции Spring Batch. Для этого мы собираемся добавить spring-boot-starter-batch в pom.xml.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
</dependency>

Это будет включать наиболее совместимую пакетную версию ядра и пакетную версию инфраструктуры в соответствии с нашей версией весенней загрузки. Поскольку я использую последнюю версию весенней загрузки (2.1.7.RELEASE), мы собираемся добавить в наше приложение пакетную версию 4.1.2.RELEASE.

Теперь у нас есть ядро ​​Spring Batch и инфраструктура Spring Batch в нашем приложении, мы можем начать разработку нашего образца пакетного приложения.

В этой демонстрации я собираюсь получить некоторые образцы данных из файла csv и переместить эти данные в базу данных MySQL с помощью пакета Spring. Сначала я собираюсь создать образец CSV-файла с вызовом «orders.csv» с полями order_ref, amount, order_date, note в пути к ресурсам и добавьте несколько записей.

Далее я собираюсь добавить свойства подключения к БД в application.properties.

# Platform configs
spring.application.name=batch-demo
spring.datasource.platform=org.hibernate.dialect.MySQL5Dialect
spring.datasource.url=jdbc:mysql://localhost:3306/batch_demo_db
spring.datasource.username=root
spring.datasource.password=admin
spring.jpa.show-sql=true

Ранее я говорил вам, что весенняя партия использует схему таблицы БД для хранения данных управления для весеннего пакетного процесса, которые указаны в весенней партии. в нашей базе данных эти таблицы имеют префикс «BATCH_».

Есть два способа инициализировать эту таблицу, первый - позволить spring batch создать эту таблицу автоматически, для этого нам нужно добавить это свойство в наш файл application.properties.

spring.batch.initialize-schema=always

если мы добавим «никогда» вместо «всегда», мы можем отключить инициализацию.

Другой способ инициализировать пакетные таблицы - создать их вручную. В этом примере приложения я добавил сценарий схемы в каталог dbscript.

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

Я собираюсь создать класс сущности для заказов на обработку этих данных в БД. Это просто базовая сущность с полями идентификатора, имени, суммы, даты и примечания.

Давайте включим пакетную обработку в нашем приложении. Для этого мы можем использовать аннотацию «@EnableBatchProcessing». Это позволит использовать функции Spring Batch в нашем приложении. Рекомендуется добавить все аннотации «@Enable» в основной класс вашего приложения, чтобы упростить реализацию. Поскольку все ваши функции Spring будут происходить в одном месте, если вам нужно отключить любую функцию, вам просто нужно удалить правильную аннотацию из основного класса.

Теперь приступим к настройке партии. Я создаю класс BatchConfig в приложении и автоматически подключаю к нему «JobBuilderFactory», «StepBuilderFactory».

JobBuilderFactory и StepBuilderFactory

Пакет Spring использует JobBuilderFactory для создания построителя заданий, StepBuilderFactory для создания построителя шагов и автоматически инициализирует JobRepository и PlatformTransactionManager.

Настройте ItemReader

Теперь нам нужно настроить ItemReader для чтения данных из файла order.csv. Я создаю компонент Spring с помощью FlatFileItemReader ‹T›, который является дочерним классом интерфейса ItemReader.



Здесь я создал объект FlatFileItemReaderBuilder для заказа. Я дал ему имя и ресурс, где находится наш CSV-файл, и пропустил первую строку, чтобы пропустить CSV-заголовки.

имена определяют имена полей, которые необходимо прочитать, пользовательская реализация интерфейса linemapper LineMapper для сопоставления строки файла с объектом домена.

LineMapper

Мы можем реализовать настраиваемый преобразователь строк для сопоставления строк из файла CSV с объектом домена с помощью интерфейса LineMapper. Мы можем использовать реализацию FieldSetMapper для сопоставления каждого поля с полем объекта домена и добавления его в преобразователь строк с настраиваемыми разделителями.

FieldSetMapper

Я реализовал настраиваемый OrderFieldMapper с помощью FieldSetMapper для сопоставления каждого поля с объектом домена.

Настроить ItemProcessor

Теперь у нас есть ItemReader для чтения данных. Теперь мы собираемся создать ItemProcessor для обработки этих данных перед записью их в базу данных, для этого я могу создать Custom ItemProcessor, используя интерфейс ItemProcessor.

OrderProcessor

Я создал собственный OrderProcessor, чтобы преобразовать дату заказа из util.Date в time.LocalDateTime. Это простая обработка, которую я использовал, чтобы показать, как работает обработчик элементов. Вы можете использовать это для реализации своей пользовательской логики, которую необходимо запустить перед записью данных в базу данных.

Теперь я собираюсь определить его как компонент Spring в нашем классе конфигурации BatchConfig.

Настройте ItemWriter

Теперь давайте настроим ItemWriter для записи этих обработанных данных в нашу базу данных MySQL. Мы можем использовать либо JdbcBatchWriter для вставки данных с использованием шаблона JDBC, либо мы можем использовать JpaItemWriter, который будет использовать JPA и EntityManager. для вставки данных в базу данных. В этом примере я использовал JDBC, но вы можете использовать любой из них, который лучше всего соответствует вашим требованиям.

Настроить задание и шаг

Теперь, когда мы завершили реализацию чтения, обработки и записи для нашего приложения, нам нужно определить шаг, в котором эти считыватель, процессор и писатель будут использовать StepBuilderFactory для внедрения в наше пакетное задание.

Шаг

Здесь я установил считыватель, процессор и писатель на Step. И я определил блок как 5, поэтому он будет читать, обрабатывать и записывать блок из 5 наборов данных для каждой транзакции.

Работа

Наконец, нам нужно настроить нашу работу.

Это конфигурация задания, в которой я ввел в задание шаг и слушатель. Мы можем реализовать настраиваемые прослушиватели с помощью JobExecutionListenerSupport для прослушивания и регистрации результатов до или после выполнения задания.

Эти журналы будут распечатаны до и после задания. В этих методах мы можем иметь собственную реализацию.

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



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

Полная реализация и сценарии БД этого можно найти в github.