Весенняя партия, известная как Spring Batch, представляет собой мощный модуль в рамках Spring Framework, который предлагает готовые реализации для задач пакетной обработки. Этот инструмент особенно полезен в сценариях, где данные необходимо обрабатывать в нескольких пакетах, таких как генерация ежедневных отчетов, периодический импорт данных в базу данных или выполнение сложных вычислений и преобразований данных.
Основные компоненты Spring Batch
Типичное приложение для пакетной обработки включает несколько шагов:
- Не нужно изобретать колесо заново.
- Бесшовная интеграция с экосистемой Spring.
- Обработка на основе кусков.
- Включает возможности ввода/вывода, такие как поддержка широкого спектра источников и целей данных, включая базы данных, XML, JSON и плоские файлы.
- Детализированный мониторинг и логирование: позволяет отслеживать выполнение задач и шагов, что упрощает понимание состояния и производительности пакетных задач.
Spring Batch предоставляет два различных способа реализации задачи: с использованием Tasklet и Chunk.
Tasklet — это единичная задача в рамках шага. Интерфейс Tasklet определяет один метод execute()
, который вызывается один раз во время выполнения шага.
Обработка на основе кусков более подходит для обработки больших наборов данных, где данные могут быть прочитаны, обработаны и записаны в меньших, управляемых кусках. Это обычно используется для чтения данных из базы данных или файла и их обработки запись за записью. Модель куска построена вокруг трех основных компонентов: Reader, Writer и Processor.
Spring Boot Batch Chunk Processing
Ключевые компоненты приложения Spring Boot Batch включают:
- Job
- Step
- Readers, Writers, Processors
- Job Repository
- Job Launcher
JobLauncher — это интерфейс, отвечающий за запуск задач. Он обрабатывает получение параметров задачи и запуск задачи с этими параметрами. Обычно используется для запуска задачи из различных триггеров, таких как событие приложения, вызов REST API или планировщик.
Job в Spring Batch инкапсулирует весь процесс пакетной обработки и определяется серией шагов. Одна задача может иметь один или несколько шагов, где каждый шаг обычно включает чтение данных, их обработку и запись обработанных данных в выходной источник.
ItemReader отвечает за чтение данных из различных источников, таких как базы данных или файлы. ItemReader имеет метод read()
; каждый раз при вызове этого метода он возвращает один элемент. Если больше нет элементов для чтения, он возвращает null, чтобы указать на конец ввода данных.
ItemProcessor является необязательным и используется для проверки, преобразования или фильтрации элементов перед передачей их ItemWriter. ItemWriter принимает обработанные элементы и записывает их в базу данных или файл.
JobRepository выполняет всю тяжелую работу, такую как запись статуса задач в базу данных. Он отслеживает, какие задачи выполняются, какие завершены, и если задача не удалась, на каком шаге она не удалась. Это критически важно для задач, которые нужно перезапустить после сбоя, обеспечивая возможность продолжения задачи с того места, где она остановилась.
Загрузка данных CSV в Postgres SQL с использованием Spring Batch
Этот пример использует обработку на основе кусков для чтения файлов CSV, их обработки и последующего хранения в Postgres SQL. Для управления миграциями базы данных мы будем использовать Flyway.
Зависимости
Используйте Spring Initializr для начальной настройки проекта Spring Boot, выбрав необходимые зависимости. Этот пример использует Java 17 и Spring Boot 3.2.4 и включает следующие зависимости:
- Spring Batch
- Spring Data JPA
- PostgreSQL Driver
- Lombok – полностью опционально для уменьшения шаблонного кода