Java

Spring Batch 3.0 – это подпроект Spring Framework, реализующий стандарт JSR-352 для выполнения пакетных заданий. Приступим сразу к делу и покажем на примере для чего это все нужно. Напишем небольшое веб-приложение, которое будет запускать пакетное задание и отображать состояние выполнения клиенту. В нескольких частях мы будем решать возникшие проблемы и изучать “фишки” Spring Batch’a.

Исходники для этого примера можно найти на https://github.com/JavaGrinko/batch-example

Скачайте репозиторий и переключитесь на ветку step0:

Мы напишем приложение, которое загружает товары из csv-файла в базу данных. Будем использовать:

  • Spring Boot в качестве каркаса для приложения
  • Встроенная база данных H2
  • Lombok
  • Spring Batch версии 3.0.7.RELEASE

Подключим все зависимости в build.gradle файл:

Модель данных для товара будет выглядеть следующим образом:

Добавим в папку src/main/resource файл schema-all.sql, который Spring Boot автоматически найдет и обработает при запуске приложения:

Добавим в ту же папку файл с товарами import.csv:

Данные готовы, осталось всего лишь перегнать их в базу данных. Делать мы это будем с помощью пакетного задания. Здесь придется написать немного теории по Batch, чтобы понимать что происходит. Для начала, термины предметной области на картинке из стандарта JSR-352:

spring-batch-reference-model

Step – это шаг пакетного задания. Содержит ItemReader, ItemProcessor и ItemWriter для чтения, обработки и записи результата обработки. Всё очень абстрактно, ведь спект типов задач очень широк. Например, шаг может читать данные из (файла|БД|REST-сервиса и т.д.), обрабатывать их произвольным образом (проверять, конвертировать в другие объекты и т.д.) и записывать результат обработки в (файл|БД|отправить на email и т.д.).

Job – это объект, который содержит последовательный список шагов Step и называется работой.

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

JobRepository выполняет CRUD операции с мета-данными работ Job и шагов Step. Это нужно для некоторых “фишек” Batch, например, для перезапуска выполнения работы после аварийного отключения электричества.

Теперь вы знаете основные термины JSR-352 и Spring Batch.

Наша работа будет состоять из одного единственного шага Step step1. Начнём с Java Config, в котором опишем step1:

Вместо того, чтобы реализовывать интерфейс Step, воспользуемся поставляемой Batch’ем фабрикой шагов. Метод get возвращает объект StepBuilder и задает имя для будущего шага. Имя рекомендуется задавать уникальное в пределах одной работы, потому как при совпадении имён может возникнуть нежелательное поведение системы при перезапусках.

Далее, указывается chunk, который отвечает за “накапливание” пачки записей в ItemReader перед передачей в обработку ItemProcessor. В нашем случае этот параметр будет отвечать за размер транзакции при вставке записей в базу данных. Далее указываются бины, реализующие интерфейсы ItemReader, ItemProcessor и ItemWriter:

Spring Batch поставляет несколько стандартных реализаций интерфейсов ItemReader и ItemWriter из пакета org.springframework.batch.item. Нам подходит реализация FlatFileItemReader, так как она поддерживает формат csv, также воспользуемся реализацией JdbcBatchItemWriter. В дальнейшей статье мы напишем собственные реализации этих интерфейсов. Интерфейс ItemProcessor является функциональным и мы напишем для него лямбда-выражение, которое пока ничего не делает и возвращает объект без изменений.

Теперь, когда шаг сконфигурирован, приступим к конфигурированию самой работы Job. Воспользуемся стандартной Batch фабрикой JobBuilderFactory:

Методом get начинаем конфигурирование новой работы с названия importProductsJob. Рекомендуется задавать уникальное название работы в пределах одной базы данных, используемой JobLauncher‘ом и JobRepository. Мы не будем описывать бины JobLauncher и JobRepository, так как пока устраивают стандартные реализации, которые Spring Boot уже загрузил в контекст.

Вот так выглядит окончательный конфигурационный файл:

Для запуска задачи необходимо вызвать метод run бина JobLauncher:

Более детальное обсуждение в Spring Batch 3.0 – Часть 2: ItemReader, ItemPocessor и ItemWriter

Spring Batch 3.0 – Часть 1: Пример использования

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *