Учебники

Spring Batch — Краткое руководство

Spring Batch — Обзор

Пакетная обработка — это режим обработки, который включает в себя выполнение ряда автоматизированных сложных заданий без взаимодействия с пользователем. Пакетный процесс обрабатывает объемные данные и выполняется в течение длительного времени.

Несколько корпоративных приложений требуют обработки огромных данных для выполнения операций, включающих:

  • Основанные на времени события, такие как периодические вычисления.

  • Периодические заявки, которые обрабатываются многократно по большим наборам данных.

  • Приложения, которые занимаются обработкой и проверкой данных, доступных транзакционным способом.

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

Периодические заявки, которые обрабатываются многократно по большим наборам данных.

Приложения, которые занимаются обработкой и проверкой данных, доступных транзакционным способом.

Поэтому пакетная обработка используется в корпоративных приложениях для выполнения таких транзакций.

Что такое Spring Batch

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

В дополнение к массовой обработке, эта структура предоставляет функции для —

  • Включая ведение журнала и трассировку
  • Управление транзакциями
  • Статистика обработки заданий
  • Перезапуск работы
  • Пропустить и Управление ресурсами

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

Особенности Spring Batch

Ниже приведены заметные особенности Spring Batch —

  • Гибкость — приложения Spring Batch являются гибкими. Вам просто нужно изменить файл XML, чтобы изменить порядок обработки в приложении.

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

  • Масштабируемость. Используя методы порционирования, вы можете масштабировать приложения Spring Batch. Эти методы позволяют вам —

    • Выполните шаги задания параллельно.

    • Выполнить один поток параллельно.

  • Надежность — в случае любого сбоя вы можете перезапустить задание с того места, где оно было остановлено, отсоединив шаги.

  • Поддержка нескольких форматов файлов. Spring Batch обеспечивает поддержку большого количества программ чтения и записи, таких как XML, Flat file, CSV, MYSQL, Hibernate, JDBC, Mongo, Neo4j и т. Д.

  • Несколько способов запуска задания. Вы можете запустить задание Spring Batch с помощью веб-приложений, программ Java, командной строки и т. Д.

Гибкость — приложения Spring Batch являются гибкими. Вам просто нужно изменить файл XML, чтобы изменить порядок обработки в приложении.

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

Масштабируемость. Используя методы порционирования, вы можете масштабировать приложения Spring Batch. Эти методы позволяют вам —

Выполните шаги задания параллельно.

Выполнить один поток параллельно.

Надежность — в случае любого сбоя вы можете перезапустить задание с того места, где оно было остановлено, отсоединив шаги.

Поддержка нескольких форматов файлов. Spring Batch обеспечивает поддержку большого количества программ чтения и записи, таких как XML, Flat file, CSV, MYSQL, Hibernate, JDBC, Mongo, Neo4j и т. Д.

Несколько способов запуска задания. Вы можете запустить задание Spring Batch с помощью веб-приложений, программ Java, командной строки и т. Д.

В дополнение к этому, поддержка приложений Spring Batch —

  • Автоматическая повторная попытка после сбоя.

  • Отслеживание состояния и статистики во время выполнения пакета и после завершения обработки пакета.

  • Для запуска параллельных заданий.

  • Такие службы, как ведение журнала, управление ресурсами, пропуск и перезапуск обработки.

Автоматическая повторная попытка после сбоя.

Отслеживание состояния и статистики во время выполнения пакета и после завершения обработки пакета.

Для запуска параллельных заданий.

Такие службы, как ведение журнала, управление ресурсами, пропуск и перезапуск обработки.

Spring Batch — Окружающая среда

В этой главе мы объясним, как настроить среду Spring Batch в Eclipse IDE. Прежде чем продолжить установку, убедитесь, что вы установили Eclipse в своей системе. Если нет, загрузите и установите Eclipse в своей системе.

Для получения дополнительной информации об Eclipse, пожалуйста, обратитесь к нашему учебному пособию по Eclipse.

Настройка Spring Batch на Eclipse

Следуйте приведенным ниже инструкциям, чтобы настроить среду Spring Batch в Eclipse.

Шаг 1 — Установите Eclipse и откройте новый проект, как показано на следующем снимке экрана.

Новый проект

Шаг 2 — Создайте пример проекта Spring Batch, как показано ниже.

название проекта

Шаг 3 — Щелкните правой кнопкой мыши проект и преобразуйте его в проект Maven, как показано ниже. Как только вы преобразуете его в проект Maven, он предоставит вам файл Pom.xml, в котором вам нужно указать необходимые зависимости. После этого файлы jar будут автоматически загружены в ваш проект.

конфигурировать

Шаг 4. Теперь в pom.xml проекта скопируйте и вставьте следующее содержимое (зависимости для приложения Spring Batch ) и обновите проект.

<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/maven-v4_0_0.xsd"> 
   <modelVersion>4.0.0</modelVersion> 
   <groupId>com.tutorialspoint</groupId> 
   <artifactId>SpringBatchSample</artifactId> 
   <packaging>jar</packaging> 
   <version>1.0-SNAPSHOT</version> 
   <name>SpringBatchExample</name>
   <url>http://maven.apache.org</url>  
 
   <properties> 
      <jdk.version>1.8</jdk.version> 
      <spring.version>4.3.8.RELEASE</spring.version> 
      <spring.batch.version>3.0.7.RELEASE</spring.batch.version> 
      <mysql.driver.version>5.1.25</mysql.driver.version> 
      <junit.version>4.11</junit.version> 
   </properties>  
   
   <dependencies> 
      <!-- Spring Core --> 
      <dependency> 
         <groupId>org.springframework</groupId> 
         <artifactId>spring-core</artifactId> 
         <version>${spring.version}</version> 
      </dependency>  
      
      <!-- Spring jdbc, for database --> 
      <dependency> 
         <groupId>org.springframework</groupId> 
         <artifactId>spring-jdbc</artifactId> 
         <version>${spring.version}</version> 
      </dependency>  
      
      <!-- Spring XML to/back object --> 
      <dependency> 
         <groupId>org.springframework</groupId> 
         <artifactId>spring-oxm</artifactId> 
         <version>${spring.version}</version> 
      </dependency>  
   
      <!-- MySQL database driver --> 
      <dependency> 
         <groupId>mysql</groupId> 
         <artifactId>mysql-connector-java</artifactId>
         <version>${mysql.driver.version}</version> 
      </dependency>  
  
      <!-- Spring Batch dependencies --> 
      <dependency> 
         <groupId>org.springframework.batch</groupId> 
         <artifactId>spring-batch-core</artifactId> 
         <version>${spring.batch.version}</version> 
      </dependency> 
  
      <dependency> 
         <groupId>org.springframework.batch</groupId> 
         <artifactId>spring-batch-infrastructure</artifactId> 
         <version>${spring.batch.version}</version> 
      </dependency>  
  
      <!-- Spring Batch unit test --> 
      <dependency> 
         <groupId>org.springframework.batch</groupId> 
         <artifactId>spring-batch-test</artifactId> 
         <version>${spring.batch.version}</version> 
      </dependency>  
  
      <!-- Junit --> 
      <dependency> 
         <groupId>junit</groupId> 
         <artifactId>junit</artifactId> 
         <version>${junit.version}</version> 
         <scope>test</scope> 
      </dependency> 
   </dependencies> 
 
   <build> 
      <finalName>spring-batch</finalName> 
      <plugins> 
         <plugin> 
            <groupId>org.apache.maven.plugins</groupId> 
            <artifactId>maven-eclipse-plugin</artifactId>
            <version>2.9</version> 
            <configuration> 
               <downloadSources>true</downloadSources> 
               <downloadJavadocs>false</downloadJavadocs> 
            </configuration> 
         </plugin> 
      
         <plugin> 
            <groupId>org.apache.maven.plugins</groupId> 
            <artifactId>maven-compiler-plugin</artifactId> 
            <version>2.3.2</version> 
            <configuration> 
               <source>${jdk.version}</source> 
               <target>${jdk.version}</target> 
            </configuration> 
         </plugin> 
      </plugins> 
   </build> 
</project>     

Наконец, если вы наблюдаете зависимости Maven, вы можете заметить, что все необходимые файлы JAR были загружены.

Jar Files

Spring Batch — Архитектура

Ниже приводится схематическое представление архитектуры Spring Batch. Как показано на рисунке, архитектура содержит три основных компонента, а именно: приложение, пакетное ядро и пакетная инфраструктура .

Архитектура

Приложение. Этот компонент содержит все задания и код, который мы пишем с использованием среды Spring Batch.

Batch Core — этот компонент содержит все классы API, необходимые для управления и запуска Batch Job.

Пакетная инфраструктура. Этот компонент содержит устройства чтения, записи и службы, используемые как базовыми компонентами приложения, так и компонентами пакета.

Компоненты Spring Batch

На следующем рисунке показаны различные компоненты Spring Batch и их связь друг с другом.

Компоненты

работа

В приложении Spring Batch задание — это пакетный процесс, который должен быть выполнен. Он работает от начала до конца без перерыва. Это задание делится на этапы (или задание содержит этапы).

Мы настроим работу в Spring Batch, используя файл XML или класс Java. Ниже приведена XML-конфигурация задания в Spring Batch.

<job id = "jobid"> 
   <step id = "step1" next = "step2"/> 
   <step id = "step2" next = "step3"/> 
   <step id = "step3"/> 
</job>

Пакетное задание настраивается в тегах <job> </ job>. У него есть атрибут с именем id . В рамках этих тегов мы определяем определение и порядок шагов.

Перезапускаемый — обычно, когда задание выполняется и мы пытаемся запустить его снова, это считается перезапуском, и оно будет запущено снова. Чтобы избежать этого, вам нужно установить для перезапускаемого значения значение false, как показано ниже.

<job id = "jobid" restartable = "false" >

</job>

шаг

Шаг — это независимая часть задания, которая содержит необходимую информацию для определения и выполнения задания (его части).

Как указано на диаграмме, каждый шаг состоит из ItemReader, ItemProcessor (необязательно) и ItemWriter. Задание может содержать один или несколько шагов .

Читатели, писатели и процессоры

Средство чтения элементов считывает данные в приложение Spring Batch из определенного источника, тогда как средство записи элементов записывает данные из приложения Spring Batch в конкретное место назначения.

Процессор Item — это класс, который содержит код обработки, который обрабатывает данные, считанные в пакет пружины. Если приложение читает «n» записей, то код в процессоре будет выполняться для каждой записи.

Когда нет читателя и писателя, тасклет действует как процессор для SpringBatch. Он обрабатывает только одну задачу. Например, если мы пишем задание с простым шагом, в котором мы читаем данные из базы данных MySQL, обрабатываем их и записываем в файл (плоский), то наш шаг использует —

  • Читатель, который читает из базы данных MySQL.

  • Автор, который пишет в плоский файл.

  • Пользовательский процессор, который обрабатывает данные по нашему желанию.

Читатель, который читает из базы данных MySQL.

Автор, который пишет в плоский файл.

Пользовательский процессор, который обрабатывает данные по нашему желанию.

<job id = "helloWorldJob"> 
   <step id = "step1"> 
      <tasklet> 
         <chunk reader = "mysqlReader" writer = "fileWriter" 
            processor = "CustomitemProcessor" ></chunk> 
      </tasklet> 
   </step> 
</ job>

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

JobRepository

Репозиторий Job в Spring Batch предоставляет операции Create, Retrieve, Update и Delete (CRUD) для реализаций JobLauncher, Job и Step. Мы определим репозиторий заданий в файле XML, как показано ниже.

<job-repository id = "jobRepository"/> 

В дополнение к идентификатору , есть еще несколько опций (необязательно). Ниже приведена конфигурация репозитория заданий со всеми параметрами и их значениями по умолчанию.

<job-repository id = "jobRepository" 
   data-source = "dataSource" 
   transaction-manager = "transactionManager" 
   isolation-level-for-create = "SERIALIZABLE" 
   table-prefix = "BATCH_" 
   max-varchar-length = "1000"/>

Репозиторий в памяти. Если вы не хотите сохранять доменные объекты Spring Batch в базе данных, вы можете настроить версию jobRepository в памяти, как показано ниже.

<bean id = "jobRepository" 
   class = "org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean ">
   <property name = "transactionManager" ref = "transactionManager"/>
</bean>

JobLauncher

JobLauncher — это интерфейс, который запускает задание Spring Batch с заданным набором параметров . SampleJoblauncher — это класс, который реализует интерфейс JobLauncher . Ниже приведена конфигурация JobLauncher.

<bean id = "jobLauncher" 
   class = "org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
   <property name = "jobRepository" ref = "jobRepository" /> 
</bean>

JobInstance

JobIinstance представляет логический прогон задания; он создается, когда мы запускаем работу. Каждый экземпляр задания отличается по имени задания и параметрам, переданным ему во время работы.

Если выполнение JobInstance завершается неудачно, тот же JobInstance может быть выполнен снова. Следовательно, каждый JobInstance может иметь несколько выполнений работы.

JobExecution и StepExecution

JobExecution и StepExecution представляют представление выполнения задания / шага. Они содержат информацию о выполнении задания / шага, такую ​​как время начала (задания / шага), время окончания (задания / шага).

Spring Batch — Применение

Почти все примеры в этом руководстве содержат следующие файлы:

  • Файл конфигурации (файл XML)
  • Тасклет / процессор (класс Java)
  • Java-класс с сеттерами и геттерами (Java-класс (bean))
  • Класс Mapper (класс Java)
  • Класс запуска (класс Java)

Конфигурационный файл

Файл конфигурации (XML) содержит следующее:

  • Определение работы и шага .

  • Фасоль, определяющая читателей и писателей .

  • Определение таких компонентов, как JobLauncher, JobRepository, менеджер транзакций и источник данных.

Определение работы и шага .

Фасоль, определяющая читателей и писателей .

Определение таких компонентов, как JobLauncher, JobRepository, менеджер транзакций и источник данных.

В наших примерах для лучшего понимания мы разделили это на два файла : файл job.xml (определяет задание, шаг, читателя и записывающее устройство) и файл context.xml (средство запуска задания, репозиторий заданий, менеджер транзакций и источник данных).

Mapper Class

Класс Mapper, в зависимости от читателя, реализует интерфейсы, такие как отображение строк, отображение наборов полей и т. Д. Он содержит код для получения данных из чтения и для установки его в класс Java с методами set и getter (Java Bean) ,

Java Bean Class

Класс Java с сеттерами и геттерами (Java bean) представляет данные с несколькими значениями. Он действует как вспомогательный класс. Мы передадим данные от одного компонента (читателя, писателя, обработчика) к другому в виде объекта этого класса.

Тасклет / процессор

Класс Tasklet / процессор содержит код обработки приложения Spring Batch. Процессор — это класс, который принимает объект, содержащий прочитанные данные, обрабатывает их и возвращает обработанные данные (в объекте формы).

Класс запуска

Этот класс (App.java) содержит код для запуска приложения Spring Batch.

заявка

Spring Batch — Конфигурация

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

<beans xmlns = "http://www.springframework.org/schema/beans" 
   xmlns:batch = "http://www.springframework.org/schema/batch" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation = "http://www.springframework.org/schema/batch 

   http://www.springframework.org/schema/batch/spring-batch-2.2.xsd 
   http://www.springframework.org/schema/bean   
   http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> 

В следующих разделах мы обсудим различные теги, их атрибуты и примеры, доступные в пространстве имен Spring Batch.

работа

Этот тег используется для определения / настройки работы SpringBatch. Он содержит набор шагов и может быть запущен с помощью JobLauncher.

Этот тег имеет 2 атрибута, как указано ниже —

S.No Атрибут и описание
1

Я бы

Это идентификатор задания, в котором обязательно указывается значение этого атрибута.

2

перезапускаемые

Это атрибут, который используется для указания перезапуска задания или нет. Этот атрибут не является обязательным.

Я бы

Это идентификатор задания, в котором обязательно указывается значение этого атрибута.

перезапускаемые

Это атрибут, который используется для указания перезапуска задания или нет. Этот атрибут не является обязательным.

Ниже приведена XML-конфигурация задания SpringBatch.

<job id = "jobid" restartable = "false" > 
   . . . . . . . .  
   . . . . . . . .  
   . . . . . . . . // Step definitions 
</job>

шаг

Этот тег используется для определения / настройки шагов задания SpringBatch. Он имеет следующие три атрибута —

S.No Атрибут и описание
1

Я бы

Это идентификатор задания, в котором обязательно указывается значение этого атрибута.

2

следующий

Это ярлык для указания следующего шага.

3

родитель

Он используется для указания имени родительского компонента, от которого должна наследоваться конфигурация.

Я бы

Это идентификатор задания, в котором обязательно указывается значение этого атрибута.

следующий

Это ярлык для указания следующего шага.

родитель

Он используется для указания имени родительского компонента, от которого должна наследоваться конфигурация.

Ниже приведена XML-конфигурация шага SpringBatch.

<job id = "jobid"> 
   <step id = "step1" next = "step2"/> 
   <step id = "step2" next = "step3"/> 
   <step id = "step3"/> 
</job>

ломоть

Этот тег используется для определения / настройки фрагмента тасклета . Он имеет следующие четыре атрибута —

S.No Атрибут и описание
1

читатель

Представляет имя компонента чтения объектов. Он принимает значение типа org.springframework.batch.item.ItemReader .

2

писатель

Представляет имя компонента чтения объектов. Он принимает значение типа org.springframework.batch.item.ItemWriter .

3

процессор

Представляет имя компонента чтения объектов. Он принимает значение типа org.springframework.batch.item.ItemProcessor .

4

совершить интервал

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

читатель

Представляет имя компонента чтения объектов. Он принимает значение типа org.springframework.batch.item.ItemReader .

писатель

Представляет имя компонента чтения объектов. Он принимает значение типа org.springframework.batch.item.ItemWriter .

процессор

Представляет имя компонента чтения объектов. Он принимает значение типа org.springframework.batch.item.ItemProcessor .

совершить интервал

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

Ниже приведена XML-конфигурация фрагмента SpringBatch.

<batch:step id = "step1"> 
   <batch:tasklet> 
      <batch:chunk reader = "xmlItemReader" 
         writer = "mysqlItemWriter" processor = "itemProcessor" commit-interval = "10"> 
      </batch:chunk> 
   </batch:tasklet> 
</batch:step> 

JobRepository

Бин JobRepository используется для настройки JobRepository с использованием реляционной базы данных. Этот бин связан с классом типа org.springframework.batch.core.repository.JobRepository .

S.No Атрибут и описание
1

источник данных

Он используется для указания имени компонента, который определяет источник данных.

2

TransactionManager

Он используется для указания имени компонента, который определяет менеджер транзакций.

3

databaseType

Он указывает тип реляционной базы данных, используемой в репозитории заданий.

источник данных

Он используется для указания имени компонента, который определяет источник данных.

TransactionManager

Он используется для указания имени компонента, который определяет менеджер транзакций.

databaseType

Он указывает тип реляционной базы данных, используемой в репозитории заданий.

Ниже приведен пример конфигурации JobRepository.

<bean id = "jobRepository" 
   class = "org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"> 
   <property name = "dataSource" ref = "dataSource" /> 
   <property name = "transactionManager" ref="transactionManager" /> 
   <property name = "databaseType" value = "mysql" /> 
</bean> 

JobLauncher

Компонент JobLauncher используется для настройки JobLauncher. Он связан с классом org.springframework.batch.core.launch.support.SimpleJobLauncher (в наших программах). Этот бин имеет одно свойство с именем jobrepository , и он используется для указания имени бина, который определяет jobrepository .

Ниже приведен пример конфигурации jobLauncher.

<bean id = "jobLauncher" 
   class = "org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
   <property name = "jobRepository" ref = "jobRepository" /> 
</bean>

TransactionManager

Bean-компонент TransactionManager используется для настройки TransactionManager с использованием реляционной базы данных. Этот бин связан с классом типа org.springframework.transaction.platform.TransactionManager .

<bean id = "transactionManager"
   class = "org.springframework.batch.support.transaction.ResourcelessTransactionManager" />

Источник данных

Компонент источника данных используется для настройки источника данных . Этот бин связан с классом типа org.springframework.jdbc.datasource.DriverManagerDataSource .

S.No Атрибут и описание
1

driverClassName

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

2

URL

Это указывает URL базы данных.

3

имя пользователя

Это указывает имя пользователя для соединения с базой данных.

4

пароль

Здесь указывается пароль для соединения с базой данных.

driverClassName

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

URL

Это указывает URL базы данных.

имя пользователя

Это указывает имя пользователя для соединения с базой данных.

пароль

Здесь указывается пароль для соединения с базой данных.

Ниже приведен пример конфигурации источника данных .

<bean id = "dataSource" 
   class = "org.springframework.jdbc.datasource.DriverManagerDataSource"> 
   <property name = "driverClassName" value = "com.mysql.jdbc.Driver" /> 
   <property name = "url" value = "jdbc:mysql://localhost:3306/details" /> 
   <property name = "username" value = "myuser" /> 
   <property name = "password" value = "password" /> 
</bean> 

Spring Batch — читатели, писатели и процессоры

Средство чтения элементов считывает данные в приложение Spring Batch из определенного источника, тогда как средство записи элементов записывает данные из приложения Spring Batch в конкретное место назначения.

Процессор Item — это класс, который содержит код обработки, который обрабатывает данные, считанные в пакет пружины. Если приложение читает n записей, код в процессоре будет выполняться для каждой записи.

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

<batch:job id = "helloWorldJob"> 
   <batch:step id = "step1"> 
      <batch:tasklet> 
         <batch:chunk reader = "cvsFileItemReader" writer = "xmlItemWriter" 
            processor = "itemProcessor" commit-interval = "10"> 
         </batch:chunk> 
      </batch:tasklet> 
   </batch:step> 
</batch:job>

Spring Batch предоставляет читателям и авторам возможность считывать и записывать данные из различных файловых систем / баз данных, таких как MongoDB, Neo4j, MySQL, XML, flatfile, CSV и т. Д.

Чтобы включить считыватель в ваше приложение, вам нужно определить bean-компонент для этого считывателя, предоставить значения для всех необходимых свойств в bean-компоненте и передать идентификатор такого bean-компонента в качестве значения в атрибут средства чтения элементов chunk (то же самое для писатель ).

ItemReader

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

Ниже приведены некоторые предопределенные классы ItemReader, предоставляемые Spring Batch для чтения из различных источников.

читатель Цель
FlatFIleItemReader Для чтения данных из плоских файлов.
StaxEventItemReader Для чтения данных из файлов XML.
StoredProcedureItemReader Читать данные из хранимых процедур базы данных.
JDBCPagingItemReader Для чтения данных из базы данных реляционных баз данных.
MongoItemReader Читать данные из MongoDB.
Neo4jItemReader Читать данные из Neo4jItemReader.

Нам нужно настроить ItemReaders , создав бины . Ниже приведен пример StaxEventItemReader, который считывает данные из файла XML.

<bean id = "mysqlItemWriter" 
   class = "org.springframework.batch.item.xml.StaxEventItemWriter"> 
   <property name = "resource" value = "file:xml/outputs/userss.xml" /> 
   <property name = "marshaller" ref = "reportMarshaller" /> 
   <property name = "rootTagName" value = "Tutorial" /> 
</bean> 

<bean id = "reportMarshaller" 
   class = "org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
   <property name = "classesToBeBound"> 
      <list> 
         <value>Tutorial</value> 
      </list> 
   </property> 
</bean> 

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

ItemWriter

Это элемент шага пакетного процесса, который записывает данные. ItemWriter пишет один элемент за раз. Spring Batch предоставляет интерфейс ItemWriter . Все авторы реализуют этот интерфейс.

Ниже приведены некоторые предопределенные классы ItemWriter, предоставляемые Spring Batch для чтения из различных источников.

писатель Цель
FlatFIleItemWriter Для записи данных в плоские файлы.
StaxEventItemWriter Для записи данных в файлы XML.
StoredProcedureItemWriter Для записи данных в хранимые процедуры базы данных.
JDBCPagingItemWriter Для записи данных в базу данных реляционных баз данных.
MongoItemWriter Для записи данных в MongoDB.
Neo4jItemWriter Для записи данных в Neo4j.

Точно так же нам нужно настроить ItemWriters, создав бины. Ниже приведен пример JdbcCursorItemReader, который записывает данные в базу данных MySQL.

<bean id = "dbItemReader"
   class = "org.springframework.batch.item.database.JdbcCursorItemReader" scope = "step">
   <property name = "dataSource" ref = "dataSource" />
   <property name = "sql" value = "select * from tutorialsdata" />
   <property name = "rowMapper">
      <bean class = "TutorialRowMapper" /> 
   </property>
</bean>

Обработчик предметов

ItemProcessor : ItemProcessor используется для обработки данных. Когда данный элемент недействителен, он возвращает ноль , иначе он обрабатывает данный элемент и возвращает обработанный результат. Интерфейс ItemProcessor <I, O> представляет процессор.

Класс тасклетов — когда не указаны ни читатель, ни писатель , тасклет действует как процессор для SpringBatch. Он обрабатывает только одну задачу.

Мы можем определить пользовательский процессор элементов путем реализации интерфейса ItemProcessor пакета org.springframework.batch.item.ItemProcessor . Этот класс ItemProcessor принимает объект, обрабатывает данные и возвращает обработанные данные как другой объект.

В пакетном процессе, если «n» записей или элементов данных считываются, то для каждой записи он будет считывать данные, обрабатывать их и записывать данные в записывающее устройство. Чтобы обработать данные, он передает на переданный процессор.

Например, предположим, что вы написали код для загрузки определенного документа PDF, создания новой страницы, записи элемента данных в PDF в табличном формате. Если вы запустите это приложение, оно прочитает все элементы данных из документа XML, сохранит их в базе данных MySQL и напечатает их в данном документе PDF на отдельных страницах.

пример

Ниже приведен пример класса ItemProcessor.

import org.springframework.batch.item.ItemProcessor;  

public class CustomItemProcessor implements ItemProcessor<Tutorial, Tutorial> {  
   
   @Override 
   public Tutorial process(Tutorial item) throws Exception {  
      System.out.println("Processing..." + item); 
      return item; 
   } 
} 

Spring Batch — базовое применение

В этой главе показано базовое приложение Spring Batch. Он просто выполнит тасклет для отображения сообщения.

Наше приложение Spring Batch содержит следующие файлы —

  • Файл конфигурации — это файл XML, в котором мы определяем задание и этапы задания. (Если приложение также включает в себя читателей и писателей, то конфигурация читателей и писателей также включена в этот файл.)

  • Context.xml — в этом файле мы определим компоненты, такие как репозиторий заданий, средство запуска заданий и менеджер транзакций.

  • Класс тасклетов — в этом классе мы напишем задание обработки кода (в этом случае отображается простое сообщение)

  • Класс запуска — в этом классе мы запустим пакетное приложение, запустив модуль запуска Job.

Файл конфигурации — это файл XML, в котором мы определяем задание и этапы задания. (Если приложение также включает в себя читателей и писателей, то конфигурация читателей и писателей также включена в этот файл.)

Context.xml — в этом файле мы определим компоненты, такие как репозиторий заданий, средство запуска заданий и менеджер транзакций.

Класс тасклетов — в этом классе мы напишем задание обработки кода (в этом случае отображается простое сообщение)

Класс запуска — в этом классе мы запустим пакетное приложение, запустив модуль запуска Job.

jobConfig.xml

Ниже приведен файл конфигурации нашего примера приложения Spring Batch.

<beans xmlns = "http://www.springframework.org/schema/beans" 
   xmlns:batch = "http://www.springframework.org/schema/batch" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation = "http://www.springframework.org/schema/batch 
      http://www.springframework.org/schema/batch/spring-batch-2.2.xsd
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd "> 
   <import resource="context.xml" />      
   <!-- Defining a bean --> 
   <bean id = "tasklet" class = "a_sample.MyTasklet" />  
   <!-- Defining a job--> 
   <batch:job id = "helloWorldJob">  
      <!-- Defining a Step --> 
      <batch:step id = "step1"> 
         <tasklet ref = "tasklet"/>   
      </batch:step>    
   </batch:job>  
</beans> 

context.xml

Ниже приводится context.xml нашего приложения Spring Batch.

<beans xmlns = "http://www.springframework.org/schema/beans" 
   xmlns:xsi = http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation = "http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">  
   
   <bean id = "jobRepository"   
      class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"> 
      <property name = "transactionManager" ref = "transactionManager" /> 
   </bean>     
     
   <bean id = "transactionManager" 
      class = "org.springframework.batch.support.transaction.ResourcelessTransactionManager" />  
   <bean id = "jobLauncher" 
      class = "org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
      <property name = "jobRepository" ref = "jobRepository" /> 
   </bean> 
</beans> 

Tasklet.java

Ниже приведен класс Tasklet, который отображает простое сообщение.

import org.springframework.batch.core.StepContribution; 
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;  

public class MyTasklet implements Tasklet { 
   
   @Override 
   public RepeatStatus execute(StepContribution arg0, ChunkContext arg1) throws Exception {  
      System.out.println("Hello This is a sample example of spring batch"); 
      return RepeatStatus.FINISHED; 
   } 
} 

App.java

Ниже приведен код, который запускает пакетный процесс.

import org.springframework.batch.core.Job; 
import org.springframework.batch.core.JobExecution; 
import org.springframework.batch.core.JobParameters; 
import org.springframework.batch.core.launch.JobLauncher; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App { 
   public static void main(String[] args)throws Exception { 
  
      // System.out.println("hello"); 
      String[] springConfig  =  {"a_sample/job_hello_world.xml"};  
      
      // Creating the application context object  
      ApplicationContext context = new ClassPathXmlApplicationContext(springConfig); 
      
      // Creating the job launcher 
      JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher"); 
  
      // Creating the job 
      Job job = (Job) context.getBean("helloWorldJob"); 
  
      // Executing the JOB 
      JobExecution execution = jobLauncher.run(job, new JobParameters()); 
      System.out.println("Exit Status : " + execution.getStatus()); 
   }    
}

При выполнении вышеупомянутая программа SpringBatch выдаст следующий вывод:

Apr 24, 2017 4:40:54 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh 
INFO:Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2ef1e4fa: startup date [Mon Apr 24 16:40:54 IST 2017]; root of context hierarchy 
Apr 24, 2017 4:40:54 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO: Loading XML bean definitions  
Apr 24, 2017 4:40:54 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
INFO: Loading XML bean definitions 
Apr 24, 2017 4:40:54 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 
Apr 24, 2017 4:40:55 PM org.springframework.batch.core.launch.support.SimpleJobLauncher afterPropertiesSet 
INFO: No TaskExecutor has been set, defaulting to synchronous executor. 
Apr 24, 2017 4:40:55 PM org.springframework.batch.core.launch.support.SimpleJobLauncher$1 run 
INFO: Job: [FlowJob: [name=helloWorldJob]] launched with the following parameters: [{}] 
Apr 24, 2017 4:40:55 PM org.springframework.batch.core.job.SimpleStepHandler handleStep INFO: Executing step: [step1] 
Hello This is a sample example of spring batch 
Apr 24, 2017 4:40:55 PM org.springframework.batch.core.launch.support.SimpleJobLauncher$1 run 
INFO: Job: [FlowJob: [name=helloWorldJob]] completed with the following parameters: [{}] and the following status: [COMPLETED] 
Exit Status : COMPLETED

Spring Batch — XML ​​для MySQL

В этой главе мы создадим приложение Spring Batch, которое использует XML Reader и MySQL Writer.

Reader — Читатель, который мы используем в приложении, — StaxEventItemReader для чтения данных из документов XML.

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

<?xml version="1.0" encoding="UTF-8"?> 
<tutorials> 
   <tutorial>      
      <tutorial_id>1001</tutorial_id> 
      <tutorial_author>Sanjay</tutorial_author> 
      <tutorial_title>Learn Java</tutorial_title> 
      <submission_date>06-05-2007</submission_date> 
      <tutorial_icon>https://www.tutorialspoint.com/java/images/java-minilogo.jpg</tutorial_icon> 
      <tutorial_description>Java is a high-level programming language originally 
         developed by Sun Microsystems and released in 1995. 
         Java runs on a variety of platforms. 
         This tutorial gives a complete understanding of Java.');</tutorial_description> 
   </tutorial> 
    
   <tutorial>      
      <tutorial_id>1002</tutorial_id> 
      <tutorial_author>Abdul S</tutorial_author> 
      <tutorial_title>Learn MySQL</tutorial_title> 
      <submission_date>19-04-2007</submission_date> 
      <tutorial_icon>https://www.tutorialspoint.com/mysql/images/mysql-minilogo.jpg</tutorial_icon> 
      <tutorial_description>MySQL is the most popular 
         Open Source Relational SQL database management system. 
         MySQL is one of the best RDBMS being used for developing web-based software applications. 
         This tutorial will give you quick start with MySQL 
         and make you comfortable with MySQL programming.</tutorial_description> 
   </tutorial> 
    
   <tutorial>
      <tutorial_id>1003</tutorial_id> 
      <tutorial_author>Krishna Kasyap</tutorial_author> 
      <tutorial_title>Learn JavaFX</tutorial_title> 
      <submission_date>06-07-2017</submission_date> 
      <tutorial_icon>https://www.tutorialspoint.com/javafx/images/javafx-minilogo.jpg</tutorial_icon> 
      <tutorial_description>JavaFX is a Java library used to build Rich Internet Applications. 
         The applications developed using JavaFX can run on various devices 
         such as Desktop Computers, Mobile Phones, TVs, Tablets, etc. 
         This tutorial, discusses all the necessary elements of JavaFX that are required
         to develop effective Rich Internet Applications</tutorial_description> 
   </tutorial> 
</tutorials>

Writerавтором, который мы используем в приложении, является JdbcBatchItemWriter для записи данных в базу данных MySQL. Предположим, что мы создали таблицу в MySQL внутри базы данных под названием «детали» .

CREATE TABLE details.TUTORIALS( 
   tutorial_id int(10) NOT NULL, 
   tutorial_author VARCHAR(20), 
   tutorial_title VARCHAR(50), 
   submission_date VARCHAR(20), 
   tutorial_icon VARCHAR(200), 
   tutorial_description VARCHAR(1000) 
);

Процессор . Процессор, который мы используем в приложении, — это пользовательский процессор, который записывает данные каждой записи в документ PDF.

В пакетном процессе, если были прочитаны «n» записей или элементов данных, то для каждой записи она будет считывать данные, обрабатывать их и записывать данные в Writer. Чтобы обработать данные, он передает на переданный процессор. В этом случае в пользовательском классе процессора мы написали код для загрузки определенного документа PDF, создания новой страницы, записи элемента данных в PDF в табличном формате.

Наконец, если вы запустите это приложение, оно считывает все элементы данных из документа XML, сохраняет их в базе данных MySQL и печатает их в данном документе PDF на отдельных страницах.

jobConfig.xml

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

<beans xmlns = "http://www.springframework.org/schema/beans" 
   xmlns:batch = "http://www.springframework.org/schema/batch" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:util = "http://www.springframework.org/schema/util" 
   xsi:schemaLocation = "http://www.springframework.org/schema/batch 
    
      http://www.springframework.org/schema/batch/spring-batch-2.2.xsd 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
      http://www.springframework.org/schema/util     
      http://www.springframework.org/schema/util/spring-util-3.0.xsd ">  
  
   <import resource = "../jobs/context.xml" /> 
  
   <bean id = "itemProcessor" class = "CustomItemProcessor" /> 
   <batch:job id = "helloWorldJob"> 
      <batch:step id = "step1"> 
         <batch:tasklet>           
            <batch:chunk reader = "xmlItemReader" writer = "mysqlItemWriter" processor = "itemProcessor">
            </batch:chunk> 
         </batch:tasklet> 
      </batch:step> 
   </batch:job> 
                
   <bean id = "xmlItemReader" 
      class = "org.springframework.batch.item.xml.StaxEventItemReader"> 
      <property name = "fragmentRootElementName" value = "tutorial" /> 
      <property name = "resource" value = "classpath:resources/tutorial.xml" /> 
      <property name = "unmarshaller" ref = "customUnMarshaller" /> 
   </bean> 
      
   <bean id = "customUnMarshaller" class = "org.springframework.oxm.xstream.XStreamMarshaller">
      <property name = "aliases"> 
         <util:map id = "aliases"> 
            <entry key = "tutorial" value = "Tutorial" />            
         </util:map> 
      </property> 
   </bean>  
   <bean id = "mysqlItemWriter" class = "org.springframework.batch.item.database.JdbcBatchItemWriter"> 
      <property name = "dataSource" ref = "dataSource" /> 
      <property name = "sql"> 
         <value> 
            <![CDATA[insert into details.tutorials (tutorial_id, tutorial_author, tutorial_title, 
               submission_date, tutorial_icon, tutorial_description) 
               values (:tutorial_id, :tutorial_author, :tutorial_title, :submission_date, 
               :tutorial_icon, :tutorial_description);]]>
         </value> 
      </property>   
      
      <property name = "itemSqlParameterSourceProvider"> 
         <bean class = "org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider" /> 
      </property> 
   </bean> 
</beans>     

context.xml

Ниже приводится context.xml нашего приложения Spring Batch. В этом файле мы определим компоненты, такие как репозиторий заданий, средство запуска заданий и менеджер транзакций.

<beans xmlns = "http://www.springframework.org/schema/beans" 
   xmlns:jdbc = "http://www.springframework.org/schema/jdbc" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation = "http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
      http://www.springframework.org/schema/jdbc 
      http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd"> 
   
   <!-- stored job-meta in database -->
   <bean id = "jobRepository" 
      class = "org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"> 
      <property name = "dataSource" ref = "dataSource" /> 
      <property name = "transactionManager" ref = "transactionManager" /> 
      <property name = "databaseType" value = "mysql" /> 
   </bean>  
 
   <bean id = "transactionManager" 
   class = "org.springframework.batch.support.transaction.ResourcelessTransactionMana ger" />  
   <bean id = "jobLauncher" 
      class = "org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
      <property name = "jobRepository" ref = "jobRepository" /> 
   </bean> 
  
   <!-- connect to MySQL database --> 
   <bean id = "dataSource" 
      class = "org.springframework.jdbc.datasource.DriverManagerDataSource"> 
      <property name = "driverClassName" value = "com.mysql.jdbc.Driver" /> 
      <property name = "url" value = "jdbc:mysql://localhost:3306/details" /> 
      <property name = "username" value = "myuser" /> 
      <property name = "password" value = "password" /> 
   </bean>  
 
   <!-- create job-meta tables automatically --> 
   <jdbc:initialize-database data-source = "dataSource">   
      <jdbc:script location = "org/springframework/batch/core/schema-drop-mysql.sql"/>   
      <jdbc:script location = "org/springframework/batch/core/schema-mysql.sql"/> 
   </jdbc:initialize-database> 
</beans>   

CustomItemProcessor.java

Ниже приведен класс процессора . В этом классе мы пишем код обработки в приложении. Здесь мы загружаем PDF-документ, создаем новую страницу, создаем таблицу и вставляем следующие значения для каждой записи: идентификатор учебного пособия, название учебного пособия, автор, дата отправки в таблицу.

import java.io.File; 
import java.io.IOException;  

import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.PDPageContentStream; 
import org.apache.pdfbox.pdmodel.font.PDType1Font; 
import org.springframework.batch.item.ItemProcessor;  

public class CustomItemProcessor implements ItemProcessor<Tutorial, Tutorial> {  
   
   public static void drawTable(PDPage page, PDPageContentStream contentStream, 
      float y, float margin, String[][] content) throws IOException { 
      final int rows = content.length; 
      final int cols = content[0].length; 
      final float rowHeight = 50; 
      final float tableWidth = page.getMediaBox().getWidth()-(2*margin); 
      final float tableHeight = rowHeight * rows; 
      final float colWidth = tableWidth/(float)cols; 
      final float cellMargin=5f;  
      
      // draw the rows 
      float nexty = y ; 
      for (int i = 0; i <= rows; i++) {   
         contentStream.drawLine(margin,nexty,margin+tableWidth,nexty); 
         nexty-= rowHeight; 
      }  
      
      //draw the columns 
      float nextx = margin; 
      for (int i = 0; i <= cols; i++) {
         contentStream.drawLine(nextx,y,nextx,y-tableHeight); 
         nextx += colWidth; 
      }  
      
      // now add the text    
      contentStream.setFont(PDType1Font.HELVETICA_BOLD,12);  
      
      float textx = margin+cellMargin; 
      float texty = y-15; 
      for(int i = 0; i < content.length; i++){ 
         for(int j = 0 ; j < content[i].length; j++){ 
            String text = content[i][j]; 
            contentStream.beginText(); 
            contentStream.moveTextPositionByAmount(textx,texty); 
            contentStream.drawString(text); 
            contentStream.endText(); 
            textx += colWidth; 
         } 
        
         texty-=rowHeight; 
         textx = margin+cellMargin; 
      } 
   }  
   
   @Override 
   public Tutorial process(Tutorial item) throws Exception { 
      System.out.println("Processing..." + item); 
   
      // Creating PDF document object 
      PDDocument doc = PDDocument.load(new File("C:/Examples/test.pdf"));     
      
      // Creating a blank page 
      PDPage page = new PDPage(); 
      doc.addPage( page ); 
      PDPageContentStream contentStream =  new PDPageContentStream(doc, page);  
      
      String[][] content = {{"Id",""+item.getTutorial_id()},
      {"Title", item.getTutorial_title()}, 
      {"Authour", item.getTutorial_author()}, 
      {"Submission Date", item.getSubmission_date()}} ;  
      drawTable(page, contentStream, 700, 100, content);       
      
      contentStream.close(); 
      doc.save("C:/Examples/test.pdf" ); 
      System.out.println("Hello"); 
      return item; 
   }    
}      

TutorialFieldSetMapper.java

Ниже приведен класс ReportFieldSetMapper, который устанавливает данные для класса Tutorial.

import org.springframework.batch.item.file.mapping.FieldSetMapper; 
import org.springframework.batch.item.file.transform.FieldSet; 
import org.springframework.validation.BindException;  

public class TutorialFieldSetMapper implements FieldSetMapper<Tutorial> { 
   
   @Override 
   public Tutorial mapFieldSet(FieldSet fieldSet) throws BindException {   
      // instantiating the Tutorial class 
      Tutorial tutorial = new Tutorial(); 
   
      // Setting the fields from XML 
      tutorial.setTutorial_id(fieldSet.readInt(0));   
      tutorial.setTutorial_title(fieldSet.readString(1)); 
      tutorial.setTutorial_author(fieldSet.readString(2)); 
      tutorial.setTutorial_icon(fieldSet.readString(3)); 
      tutorial.setTutorial_description(fieldSet.readString(4));   
      return tutorial;  
   }  
} 

Tutorial.java

Ниже приведен учебный класс. Это простой класс с методами установки и получения.

public class Tutorial { 
   private int tutorial_id; 
   private String tutorial_author; 
   private String tutorial_title; 
   private String submission_date; 
   private String tutorial_icon; 
   private String tutorial_description;   
   
   @Override 
   public String toString() { 
      return " [id=" + tutorial_id + ", author=" + tutorial_author  
         + ", title=" + tutorial_title + ", date=" + submission_date + ", icon =" 
         +tutorial_icon +", description = "+tutorial_description+"]"; 
   }  
   
   public int getTutorial_id() { 
      return tutorial_id; 
   }  
   
   public void setTutorial_id(int tutorial_id) { 
      this.tutorial_id = tutorial_id; 
   }  
   
   public String getTutorial_author() { 
      return tutorial_author; 
   }  
   
   public void setTutorial_author(String tutorial_author) { 
      this.tutorial_author = tutorial_author; 
   }  
   
   public String getTutorial_title() { 
      return tutorial_title; 
   } 
   
   public void setTutorial_title(String tutorial_title) { 
      this.tutorial_title = tutorial_title; 
   }  
   
   public String getSubmission_date() { 
      return submission_date; 
   }  
   
   public void setSubmission_date(String submission_date) { 
      this.submission_date = submission_date; 
   }  
   
   public String getTutorial_icon() { 
      return tutorial_icon; 
   }  
   
   public void setTutorial_icon(String tutorial_icon) { 
      this.tutorial_icon = tutorial_icon; 
   }  
   
   public String getTutorial_description() { 
      return tutorial_description; 
   }  
   
   public void setTutorial_description(String tutorial_description) { 
      this.tutorial_description = tutorial_description; 
   } 
}

App.java

Ниже приведен код, который запускает пакетный процесс. В этом классе мы запустим пакетное приложение, запустив JobLauncher.

public class App { 
   public static void main(String[] args) throws Exception { 
      String[] springConfig  = {    "jobs/job_hello_world.xml" };  
      
      // Creating the application context object  
      ApplicationContext context = new ClassPathXmlApplicationContext(springConfig);  
      
      // Creating the job launcher 
      JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher"); 
   
      // Creating the job 
      Job job = (Job) context.getBean("helloWorldJob"); 
   
      // Executing the JOB 
      JobExecution execution = jobLauncher.run(job, new JobParameters()); 
      System.out.println("Exit Status : " + execution.getStatus()); 
   }    
} 

При выполнении этого приложения оно выдаст следующий вывод.

May 05, 2017 4:39:22 PM org.springframework.context.support.ClassPathXmlApplicationContext 
prepareRefresh 
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@306a30c7: 
startup date [Fri May 05 16:39:22 IST 2017]; root of context hierarchy 
May 05, 2017 4:39:23 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
May 05, 2017 4:39:32 PM org.springframework.batch.core.job.SimpleStepHandler handleStep 
INFO: Executing step: [step1] 
Processing ... [id=1001, author=Sanjay, title=Learn Java, date=06-05-2007, 
icon =https://www.tutorialspoint.com/java/images/java-mini-logo.jpg, 
description = Java is a high-level programming language originally developed by Sun Microsystems 
and released in 1995. Java runs on a variety of platforms. 
This tutorial gives a complete understanding of Java.');] 
Hello 
Processing .. [id=1002, author=Abdul S, title=Learn MySQL, date=19-04-2007, 
icon =https://www.tutorialspoint.com/mysql/images/mysql-mini-logo.jpg, 
description = MySQL is the most popular Open Source Relational SQL database management system. 
MySQL is one of the best RDBMS being used for developing web-based software applications. 
This tutorial will give you quick start with MySQL and make you comfortable with MySQL programming.] 
Hello 
Processing ... [id=1003, author=Krishna Kasyap, title=Learn JavaFX, date=06-072017, 
icon =https://www.tutorialspoint.com/javafx/images/javafx-mini-logo.jpg,
description = JavaFX is a Java library used to build Rich Internet Applications. 
The applications developed using JavaFX can run on various devices 
such as Desktop Computers, Mobile Phones, TVs, Tablets, etc. 
This tutorial, discusses all the necessary elements of JavaFX 
that are required to develop effective Rich Internet Applications] 
Hello 
May 05, 2017 4:39:36 PM org.springframework.batch.core.launch.support.SimpleJobLauncher run 
INFO: Job: [FlowJob: [name=helloWorldJob]] completed with the following parameters: [{}] 
and the following status: [COMPLETED] 
Exit Status : COMPLETED 

Если вы проверите таблицу details.tutorial в базе данных, она покажет вам следующий вывод:

учебник _id учебник _author учебник _title Дата подачи учебник _icon учебник _ описание
1001 Санджай Учить Java 06.05.2007 https: //www.tutorials point.com / java / images / java-mini-logo.jpg Java — это язык программирования высокого уровня, первоначально разработанный Sun Microsystems и выпущенный в 1995 году. Java работает на различных платформах. Этот учебник дает полное понимание Java.
1002 Абдул С Изучай MySQL 19-04-2007 https: // WWW. tutorialspoint.com / mysql / images /mysql-minilogo.jpg MySQL — самая популярная система управления базами данных с открытым исходным кодом. MySQL — одна из лучших РСУБД, используемая для разработки программных приложений на базе Интернета. Этот учебник даст вам быстрый старт с MySQL и позволит вам освоить программирование на MySQL.
1003 Изучай JavaFX Кришна Касьяп 06-07-2017 https: // WWW. tutorialspoint.com / javafx / images / javafx-minilogo.jpg MySQL — самая популярная система управления базами данных с открытым исходным кодом. MySQL — одна из лучших РСУБД, используемая для разработки программных приложений на базе Интернета. Этот учебник даст вам быстрый старт с MySQL и позволит вам освоить программирование на MySQL.

Это создаст PDF с записями на каждой странице, как показано ниже.

Миниатюры страниц

Spring Batch — CSV в XML

В этой главе мы создадим простое приложение Spring Batch, которое использует CSV Reader и XML Writer.

Readerчитатель, который мы используем в приложении, это FlatFileItemReader для чтения данных из файлов CSV.

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

1001, "Sanjay", "Learn Java", 06/05/2007 
1002, "Abdul S", "Learn MySQL", 19/04/2007 
1003, "Krishna Kasyap", "Learn JavaFX", 06/07/2017

Writer — Writer, который мы используем в приложении, это StaxEventItemWriter для записи данных в файл XML.

Процессор — Процессор, который мы используем в приложении, — это пользовательский процессор, который просто печатает записи, прочитанные из файла CSV.

jobConfig.xml

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

<beans xmlns = " http://www.springframework.org/schema/beans" 
   xmlns:batch = "http://www.springframework.org/schema/batch" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation = "http://www.springframework.org/schema/batch 
      http://www.springframework.org/schema/batch/spring-batch-2.2.xsd 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">  
   
   <import resource = "../jobs/context.xml" />  
   
   <bean id = "report" class = "Report" scope = "prototype" /> 
   <bean id = "itemProcessor" class = "CustomItemProcessor" />  
   
   <batch:job id = "helloWorldJob"> 
   
      <batch:step id = "step1"> 
   
         <batch:tasklet> 
            <batch:chunk reader = "cvsFileItemReader" writer = "xmlItemWriter" 
               processor = "itemProcessor" commit-interval = "10"> 
            </batch:chunk> 
         </batch:tasklet> 
      </batch:step> 
   </batch:job>  
 
   <bean id = "cvsFileItemReader" 
      class = "org.springframework.batch.item.file.FlatFileItemReader">  
      <property name = "resource" value = "classpath:resources/report.csv" /> 
      <property name = "lineMapper"> 
         <bean 
            class = "org.springframework.batch.item.file.mapping.DefaultLineMapper"> 
            <property name = "lineTokenizer"> 
               <bean    
                  class = "org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> 
                  <property name = "names" value = "tutorial_id, 
                     tutorial_author, Tutorial_title, submission_date" /> 
               </bean> 
            </property> 
      
            <property name = "fieldSetMapper"> 
               <bean class = "ReportFieldSetMapper" /> 
            </property> 
         </bean> 
      </property> 
   </bean>  
   
   <bean id = "xmlItemWriter" 
      class = "org.springframework.batch.item.xml.StaxEventItemWriter"> 
      <property name = "resource" value = "file:xml/outputs/tutorials.xml" /> 
      <property name = "marshaller" ref = "reportMarshaller" /> 
      <property name = "rootTagName" value = "tutorials" /> 
   </bean>  
 
   <bean id = "reportMarshaller" 
      class = "org.springframework.oxm.jaxb.Jaxb2Marshaller">
      <property name = "classesToBeBound"> 
         <list> 
            <value>Tutorial</value> 
         </list> 
      </property> 
   </bean> 
</beans> 

context.xml

Ниже приводится context.xml нашего приложения Spring Batch. В этом файле мы определим компоненты, такие как репозиторий заданий, средство запуска заданий и менеджер транзакций.

<beans xmlns = "http://www.springframework.org/schema/beans" 
   xmlns:jdbc = "http://www.springframework.org/schema/jdbc" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation = "http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
      http://www.springframework.org/schema/jdbc 
      http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd">  
   <!-- stored job-meta in database --> 
   <bean id = "jobRepository" 
      class = "org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"> 
      <property name = "dataSource" ref = "dataSource" /> 
      <property name = "transactionManager" ref = "transactionManager" /> 
      <property name = "databaseType" value = "mysql" /> 
   </bean>  
 
   <bean id = "transactionManager" 
      class = "org.springframework.batch.support.transaction.ResourcelessTransactionManager" />  
   <bean id = "jobLauncher" 
      class = "org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
      <property name = "jobRepository" ref = "jobRepository" /> 
   </bean>  
   
   <bean id = "dataSource" class = "org.springframework.jdbc.datasource.DriverManagerDataSource"> 
      <property name = "driverClassName" value = "com.mysql.jdbc.Driver" /> 
      <property name = "url" value = "jdbc:mysql://localhost:3306/details" />
      <property name = "username" value = "myuser" /> 
      <property name = "password" value = "password" /> 
   </bean> 
  
   <!-- create job-meta tables automatically --> 
   <jdbc:initialize-database data-source = "dataSource">   
      <jdbc:script location = "org/springframework/batch/core/schema-drop-mysql.sql" /> 
      <jdbc:script location = "org/springframework/batch/core/schema-mysql.sql" /> 
   </jdbc:initialize-database> 
</beans>

CustomItemProcessor.java

Ниже приведен класс Processor. В этом классе мы пишем код обработки в приложении. Здесь мы печатаем содержимое каждой записи.

import org.springframework.batch.item.ItemProcessor;  

public class CustomItemProcessor implements ItemProcessor<Tutorial, Tutorial> {  
   
   @Override 
   public Tutorial process(Tutorial item) throws Exception {  
      System.out.println("Processing..." + item); 
      return item; 
   } 
} 

TutorialFieldSetMapper.java

Ниже приведен класс TutorialFieldSetMapper, который устанавливает данные для класса Tutorial.

import org.springframework.batch.item.file.mapping.FieldSetMapper; 
import org.springframework.batch.item.file.transform.FieldSet; 
import org.springframework.validation.BindException;  

public class TutorialFieldSetMapper implements FieldSetMapper<Tutorial> {  

   @Override 
   public Tutorial mapFieldSet(FieldSet fieldSet) throws BindException {  
      
      //Instantiating the report object  
      Tutorial tutorial = new Tutorial(); 
       
      //Setting the fields  
      tutorial.setTutorial_id(fieldSet.readInt(0)); 
      tutorial.setTutorial_author(fieldSet.readString(1)); 
      tutorial.setTutorial_title(fieldSet.readString(2)); 
      tutorial.setSubmission_date(fieldSet.readString(3)); 
       
      return tutorial; 
   } 
}

Tutorial.java класс

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

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement;  

@XmlRootElement(name = "tutorial") 
public class Tutorial {  
   private int tutorial_id; 
   private String tutorial_author; 
   private String tutorial_title;
   private String submission_date;  
 
   @XmlAttribute(name = "tutorial_id") 
   public int getTutorial_id() { 
      return tutorial_id; 
   }  
 
   public void setTutorial_id(int tutorial_id) { 
      this.tutorial_id = tutorial_id; 
   }  
 
   @XmlElement(name = "tutorial_author") 
   public String getTutorial_author() { 
      return tutorial_author; 
   }  
   public void setTutorial_author(String tutorial_author) { 
      this.tutorial_author = tutorial_author; 
   }  
      
   @XmlElement(name = "tutorial_title") 
   public String getTutorial_title() { 
      return tutorial_title; 
   }  
   
   public void setTutorial_title(String tutorial_title) { 
      this.tutorial_title = tutorial_title; 
   }  
   
   @XmlElement(name = "submission_date") 
   public String getSubmission_date() { 
      return submission_date; 
   }  
   
   public void setSubmission_date(String submission_date) { 
      this.submission_date = submission_date; 
   } 
   
   @Override 
   public String toString() { 
      return "  [Tutorial id=" + tutorial_id + ", 
         Tutorial Author=" + tutorial_author  + ", 
         Tutorial Title=" + tutorial_title + ", 
         Submission Date=" + submission_date + "]"; 
   } 
}  

App.java

Ниже приведен код, который запускает пакетный процесс. В этом классе мы запустим пакетное приложение, запустив JobLauncher.

import org.springframework.batch.core.Job; 
import org.springframework.batch.core.JobExecution; 
import org.springframework.batch.core.JobParameters; 
import org.springframework.batch.core.launch.JobLauncher; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext;  

public class App {  
   public static void main(String[] args) throws Exception { 
     
      String[] springConfig  =  { "jobs/job_hello_world.xml" };  
      
      // Creating the application context object        
      ApplicationContext context = new ClassPathXmlApplicationContext(springConfig);  
      
      // Creating the job launcher 
      JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher"); 
   
      // Creating the job 
      Job job = (Job) context.getBean("helloWorldJob"); 
   
      // Executing the JOB 
      JobExecution execution = jobLauncher.run(job, new JobParameters());
      System.out.println("Exit Status : " + execution.getStatus()); 
   } 
}       

При выполнении этого приложения оно выдаст следующий вывод.

May 08, 2017 10:10:12 AM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 
INFO: Refreshing 
org.springframework.context.support.ClassPathXmlApplicationContext@3d646c37: startup date 
[Mon May 08 10:10:12 IST 2017]; root of context hierarchy 
May 08, 2017 10:10:12 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
May 08, 2017 10:10:15 AM org.springframework.jdbc.datasource.init.ScriptUtils executeSqlScript 
INFO: Executing step: [step1] 
Processing...  [Tutorial id=1001, Tutorial Author=Sanjay, 
Tutorial Title=Learn Java, Submission Date=06/05/2007] 
Processing...  [Tutorial id=1002, Tutorial Author=Abdul S, 
Tutorial Title=Learn MySQL, Submission Date=19/04/2007] 
Processing...  [Tutorial id=1003, Tutorial Author=Krishna Kasyap, 
Tutorial Title=Learn JavaFX, Submission Date=06/07/2017] 
May 08, 2017 10:10:21 AM org.springframework.batch.core.launch.support.SimpleJobLauncher run 
INFO: Job: [FlowJob: [name=helloWorldJob]] completed with the following parameters: 
[{}] and the following status: [COMPLETED] 
Exit Status : COMPLETED

Это создаст файл XML со следующим содержимым.

<?xml version = "1.0" encoding = "UTF-8"?> 
<tutorials> 
   <tutorial tutorial_id = "1001"> 
      <submission_date>06/05/2007</submission_date> 
      <tutorial_author>Sanjay</tutorial_author> 
      <tutorial_title>Learn Java</tutorial_title> 
   </tutorial> 
   
   <tutorial tutorial_id = "1002"> 
      <submission_date>19/04/2007</submission_date> 
      <tutorial_author>Abdul S</tutorial_author> 
      <tutorial_title>Learn MySQL</tutorial_title> 
   </tutorial> 
   
   <tutorial tutorial_id = "1003"> 
      <submission_date>06/07/2017</submission_date>
      <tutorial_author>Krishna Kasyap</tutorial_author> 
      <tutorial_title>Learn JavaFX</tutorial_title> 
   </tutorial> 
</tutorials>

Spring Batch — MySQL в XML

В этой главе мы создадим приложение Spring Batch, которое использует программу чтения MySQL и программу записи XML.

Reader — Читатель, который мы используем в приложении, — JdbcCursorItemReader для чтения данных из базы данных MySQL.

Предположим, что мы создали таблицу в базе данных MySQL, как показано ниже —

CREATE TABLE details.xml_mysql( 
   person_id int(10) NOT NULL, 
   sales VARCHAR(20), 
   qty int(3), 
   staffName VARCHAR(20), 
   date VARCHAR(20) 
);

Предположим, мы вставили в него следующие записи.

mysql> select * from tutorialsdata; 
+-------------+-----------------+----------------+-----------------+ 
| tutorial_id | tutorial_author | tutorial_title | submission_date | 
+-------------+-----------------+----------------+-----------------+ 
|         101 | Sanjay          | Learn Java     | 06-05-2007      | 
|         102 | Abdul S         | Learn MySQL    | 19-04-2007      | 
|         103 | Krishna Kasyap  | Learn JavaFX   | 06-07-2017      | 
+-------------+-----------------+----------------+-----------------+ 
3 rows in set (0.00 sec) 

Writer — Writer, который мы используем в приложении, это StaxEventItemWriter для записи данных в файл XML.

Процессор — Процессор, который мы используем в приложении, — это пользовательский процессор, который просто печатает записи, прочитанные из файла CSV.

jobConfig.xml

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

<beans xmlns = "http://www.springframework.org/schema/beans" 
   xmlns:batch = "http://www.springframework.org/schema/batch" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:util = "http://www.springframework.org/schema/util" 
   xsi:schemaLocation = " http://www.springframework.org/schema/batch 
      http://www.springframework.org/schema/batch/spring-batch-2.2.xsd 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">  
   
   <import resource = "../jobs/context.xml" /> 
  
   <bean id = "report" class = "Report" scope = "prototype" /> 
   <bean id = "itemProcessor" class = "CustomItemProcessor" />  
   
   <batch:job id = "helloWorldJob"> 
      <batch:step id = "step1"> 
         <batch:tasklet> 
            <batch:chunk reader = "dbItemReader" 
               writer = "mysqlItemWriter" processor = "itemProcessor" commit-interval = "10">
            </batch:chunk> 
         </batch:tasklet> 
      </batch:step> 
   </batch:job> 
         
   <bean id = "dbItemReader" 
      class = "org.springframework.batch.item.database.JdbcCursorItemReader" scope = "step"> 
      <property name = "dataSource" ref = "dataSource" /> 
      <property name = "sql" value = "select * from tutorials_data" /> 
      <property name = "rowMapper"> 
         <bean class = "TutorialRowMapper" /> 
      </property> 
   </bean>             
   <bean id = "mysqlItemWriter" 
      class = "org.springframework.batch.item.xml.StaxEventItemWriter"> 
      <property name = "resource" value = "file:xml/outputs/tutorials.xml" /> 
      <property name = "marshaller" ref = "reportMarshaller" />
      <property name = "rootTagName" value = "Tutorial" /> 
   </bean>  
   
   <bean id = "reportMarshaller" class = "org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
      <property name = "classesToBeBound"> 
         <list> 
            <value>Tutorial</value> 
         </list> 
      </property> 
   </bean> 
</beans>  

context.xml

Ниже приводится context.xml нашего приложения Spring Batch. В этом файле мы определим компоненты, такие как репозиторий заданий, средство запуска заданий и менеджер транзакций.

<beans xmlns = " http://www.springframework.org/schema/beans" 
   xmlns:jdbc = "http://www.springframework.org/schema/jdbc" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation = "http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
      http://www.springframework.org/schema/jdbc 
      http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd "> 
   
   <!-- stored job-meta in database --> 
   <bean id = "jobRepository"  
      class = "org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"> 
      <property name = "dataSource" ref = "dataSource" /> 
      <property name = "transactionManager" ref = "transactionManager" /> 
      <property name = "databaseType" value = "mysql" /> 
   </bean>  
   
   <bean id = "transactionManager" 
      class = "org.springframework.batch.support.transaction.ResourcelessTransactionMana ger" />  
   <bean id = "jobLauncher"
      class = "org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
      <property name = "jobRepository" ref = "jobRepository" /> 
   </bean> 
  
   <!-- connect to MySQL database --> 
   <bean id = "dataSource" 
      class = "org.springframework.jdbc.datasource.DriverManagerDataSource"> 
      <property name = "driverClassName" value = "com.mysql.jdbc.Driver" /> 
      <property name = "url" value = "jdbc:mysql://localhost:3306/details" /> 
      <property name = "username" value = "myuser" /> 
      <property name = "password" value = "password" /> 
   </bean> 
  
   <!-- create job-meta tables automatically --> 
   <jdbc:initialize-database data-source = "dataSource">   
      <jdbc:script location = "org/springframework/batch/core/schema-drop-mysql.sql" />   
      <jdbc:script location = "org/springframework/batch/core/schema-mysql.sql" /> 
   </jdbc:initialize-database> 
</beans>  

CustomItemProcessor.java

Ниже приведен класс Processor. В этом классе мы пишем код обработки в приложении. Здесь мы печатаем содержимое каждой записи.

import org.springframework.batch.item.ItemProcessor;  

public class CustomItemProcessor implements ItemProcessor<Tutorial, Tutorial> {  

   @Override 
   public Tutorial process(Tutorial item) throws Exception { 
      System.out.println("Processing..." + item); 
      return item; 
   } 
} 

TutorialRowMapper.java

Ниже приведен класс TutorialRowMapper, который устанавливает данные для класса Tutorial .

import java.sql.ResultSet; 
import java.sql.SQLException; 
import org.springframework.jdbc.core.RowMapper;  

public class TutorialRowMapper implements RowMapper<Tutorial> {  
   
   @Override 
   public Tutorial mapRow(ResultSet rs, int rowNum) throws SQLException {  
      
      Tutorial tutorial = new Tutorial();  
      tutorial.setTutorial_id(rs.getInt("tutorial_id")); 
      tutorial.setTutorial_author(rs.getString("tutorial_author")); 
      tutorial.setTutorial_title(rs.getString("tutorial_title")); 
      tutorial.setSubmission_date(rs.getString("submission_date"));  
      return tutorial; 
   } 
}

Tutorial.java

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

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement;  

@XmlRootElement(name = "details") 
public class Tutorial {  
   
   int tutorial_id; 
   String tutorial_author;
   String submission_date; 
  
   @XmlAttribute(name = "tutorial_id") 
   public int getTutorial_id() { 
      return tutorial_id; 
   }  
   
   public void setTutorial_id(int tutorial_id) { 
      this.tutorial_id = tutorial_id; 
   }  
 
   @XmlElement(name = "tutorial_author") 
   public String getTutorial_author() { 
      return tutorial_author; 
   }  
   
   public void setTutorial_author(String tutorial_author) { 
      this.tutorial_author = tutorial_author; 
   }  
 
   @XmlElement(name = "tutorial_title") 
   public String getTutorial_title() { 
      return tutorial_title; 
   } 
  
   public void setTutorial_title(String tutorial_title) { 
      this.tutorial_title = tutorial_title; 
   }  
 
   @XmlElement(name = "submission_date") 
   public String getSubmission_date() { 
      return submission_date; 
   }

   public void setSubmission_date(String submission_date) { 
      this.submission_date = submission_date; 
   }  

   public String toString() { 
      return " [Tutorial Id=" + tutorial_id + ", 
      Tutorial Author =" + tutorial_author  + ", 
      Tutorial Title =" + tutorial_title + ", 
      Submission Date =" + submission_date + "]"; 
   } 
} 

App.java

Ниже приведен код, который запускает пакетный процесс. В этом классе мы запустим пакетное приложение, запустив JobLauncher.

import org.springframework.batch.core.Job; 
import org.springframework.batch.core.JobExecution; 
import org.springframework.batch.core.JobParameters; 
import org.springframework.batch.core.launch.JobLauncher; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext;  

public class App {  
   public static void main(String[] args) throws Exception { 
     
      String[] springConfig  =  { "jobs/job_hello_world.xml" };  
      
      // Creating the application context object  
      ApplicationContext context = new ClassPathXmlApplicationContext(springConfig);  
      
      // Creating the job launcher 
      JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher"); 
    
      // Creating the job 
      Job job = (Job) context.getBean("helloWorldJob");
      
      // Executing the JOB 
      JobExecution execution = jobLauncher.run(job, new JobParameters()); 
      System.out.println("Exit Status : " + execution.getStatus()); 
   } 
}      

При выполнении этого приложения оно выдаст следующий вывод.

May 08, 2017 11:32:06 AM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3d646c37: 
startup date [Mon May 08 11:32:06 IST 2017]; root of context hierarchy 
May 08, 2017 11:32:06 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from class path resource [jobs/job_hello_world.xml] 
May 08, 2017 11:32:07 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions   
May 08, 2017 11:32:14 AM org.springframework.batch.core.job.SimpleStepHandler handleStep 
INFO: Executing step: [step1] 
Processing... [Tutorial Id=101, Tutorial Author=Sanjay, 
Tutorial Title=Learn Java, Submission Date=06-05-2007] 
Processing... [Tutorial Id=102, Tutorial Author=Abdul S, 
Tutorial Title=Learn MySQL, Submission Date=19-04-2007] 
Processing... [Tutorial Id=103, Tutorial Author=Krishna Kasyap, 
Tutorial Title=Learn JavaFX, Submission Date=06-07-2017] 
May 08, 2017 11:32:14 AM org.springframework.batch.core.launch.support.SimpleJobLauncher run 
INFO: Job: [FlowJob: [name=helloWorldJob]] completed with the following parameters: 
[{}] and the following status: [COMPLETED] 
Exit Status : COMPLETED

Это создаст файл XML со следующим содержимым.

<?xml version = "1.0" encoding = "UTF-8"?> 
<Tutorial> 
   <details tutorial_id = "101"> 
      <submission_date>06-05-2007</submission_date> 
      <tutorial_author>Sanjay</tutorial_author> 
      <tutorial_title>Learn Java</tutorial_title> 
   </details> 
   
   <details tutorial_id = "102"> 
      <submission_date>19-04-2007</submission_date> 
      <tutorial_author>Abdul S</tutorial_author> 
      <tutorial_title>Learn MySQL</tutorial_title> 
   </details>  
   
   <details tutorial_id = "103"> 
      <submission_date>06-07-2017</submission_date> 
      <tutorial_author>Krishna Kasyap</tutorial_author> 
      <tutorial_title>Learn JavaFX</tutorial_title> 
   </details> 
</Tutorial>

Spring Batch — MySQL в плоский файл

В этой главе мы создадим приложение Spring Batch, которое использует MySQL Reader и Flatfile Writer (.txt).

Reader — Reader, который мы используем в приложении, — JdbcCursorItemReader для чтения данных из базы данных MySQL.

Предположим, что мы создали таблицу в базе данных MySQL, как показано ниже.

CREATE TABLE details.xml_mysql( 
   person_id int(10) NOT NULL, 
   sales VARCHAR(20), 
   qty int(3), 
   staffName VARCHAR(20), 
   date VARCHAR(20) 
); 

Предположим, мы вставили в него следующие записи.

mysql> select * from tutorialsdata; 
+-------------+-----------------+----------------+-----------------+ 
| tutorial_id | tutorial_author | tutorial_title | submission_date | 
+-------------+-----------------+----------------+-----------------+ 
|         101 | Sanjay          | Learn Java     | 06-05-2007      | 
|         102 | Abdul S         | Learn MySQL    | 19-04-2007      | 
|         103 | Krishna Kasyap  | Learn JavaFX   | 06-07-2017      | 
+-------------+-----------------+----------------+-----------------+ 
3 rows in set (0.00 sec) 

Writer — Writer, который мы используем в приложении, это FlatFileItemWriter для записи данных в плоский файл (.txt).

Процессор — Процессор, который мы используем в приложении, — это пользовательский процессор, который просто печатает записи, прочитанные из файла CSV.

jobConfig.xml

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

<beans xmlns = "http://www.springframework.org/schema/beans" 
   xmlns:batch = "http://www.springframework.org/schema/batch" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:util = "http://www.springframework.org/schema/util" 
   xsi:schemaLocation = "http://www.springframework.org/schema/batch 
   
      http://www.springframework.org/schema/batch/spring-batch-2.2.xsd 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">  
   
   <import resource = "../jobs/context.xml" />  
   <bean id = "tutorial" class = "Tutorial" scope = "prototype" /> 
   <bean id = "itemProcessor" class = "CustomItemProcessor" />  
   
   <batch:job id = "helloWorldJob"> 
      <batch:step id = "step1"> 
         <batch:tasklet> 
            <batch:chunk reader = "mysqlItemReader" 
               writer = "flatFileItemWriter" processor = "itemProcessor" 
               commit-interval = "10"> 
            </batch:chunk> 
         </batch:tasklet> 
      </batch:step> 
   </batch:job> 
         
   <bean id = "mysqlItemReader" 
      class = "org.springframework.batch.item.database.JdbcCursorItemReader" > 
      <property name = "dataSource" ref = "dataSource" /> 
      <property name = "sql" value = "select * from details.tutorialsdata" /> 
      <property name = "rowMapper">  
         <bean class = "TutorialRowMapper" /> 
      </property> 
   </bean>
   
   <bean id = "flatFileItemWriter" 
      class = " org.springframework.batch.item.file.FlatFileItemWriter">      
      <property name = "resource" value = "file:target/outputfiles/employee_output.txt"/> 
      <property name = "lineAggregator"> 
         <bean class = " org.springframework.batch.item.file.transform.PassThroughLineAggregator"/> 
      </property> 
   </bean> 
</beans> 

context.xml

Ниже приводится context.xml нашего приложения Spring Batch. В этом файле мы определим компоненты, такие как репозиторий заданий, средство запуска заданий и менеджер транзакций.

<beans xmlns = "http://www.springframework.org/schema/beans" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:jdbc = "http://www.springframework.org/schema/jdbc" 
   xsi:schemaLocation = "http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
      http://www.springframework.org/schema/jdbc 
      http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd "> 
   
   <!-- stored job-meta in database --> 
   <bean id = "jobRepository"  
      class = "org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"> 
      <property name = "dataSource" ref = "dataSource" /> 
      <property name = "transactionManager" ref = "transactionManager" /> 
      <property name = "databaseType" value = "mysql" /> 
   </bean>  
 
   <bean id = "transactionManager"  
      class = "org.springframework.batch.support.transaction.ResourcelessTransactionManager" />  
   
   <bean id = "dataSource" 
      class = "org.springframework.jdbc.datasource.DriverManagerDataSource"> 
      <property name = "driverClassName" value = "com.mysql.jdbc.Driver" /> 
      <property name = "url" value = "jdbc:mysql://localhost:3306/details" /> 
      <property name = "username" value = "myuser" /> 
      <property name = "password" value = "password" /> 
   </bean> 
    
   <bean id = "jobLauncher"  
      class = "org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
      <property name = "jobRepository" ref = "jobRepository" /> 
   </bean> 
  
   <!-- create job-meta tables automatically --> 
   <jdbc:initialize-database data-source = "dataSource">   
      <jdbc:script location = "org/springframework/batch/core/schema-drop-mysql.sql" />   
      <jdbc:script location = "org/springframework/batch/core/schema-mysql.sql" /> 
   </jdbc:initialize-database> 
</beans> 

CustomItemProcessor.java

Ниже приведен класс Processor. В этом классе мы пишем код обработки в приложении. Здесь мы печатаем содержимое каждой записи.

import org.springframework.batch.item.ItemProcessor;  

// Implementing the ItemProcessor interface 
public class CustomItemProcessor implements ItemProcessor<Tutorial, Tutorial> {  
 
   @Override 
   public Tutorial process(Tutorial item) throws Exception { 
      System.out.println("Processing..." + item); 
      return item; 
   } 
}

TutorialRowMapper.java

Ниже приведен класс TutorialRowMapper, который устанавливает данные для класса Tutorial .

public class TutorialRowMapper implements RowMapper<Tutorial> {  
   
   @Override 
   public Tutorial mapRow(ResultSet rs, int rowNum) throws SQLException {  
  
      Tutorial tutorial = new Tutorial();  
  
      tutorial.setTutorial_id(rs.getInt("tutorial_id")); 
      tutorial.setTutorial_title(rs.getString("tutorial_title")); 
      tutorial.setTutorial_author(rs.getString("tutorial_author")); 
      tutorial.setSubmission_date(rs.getString("submission_date"));  
      return tutorial; 
   } 
}

Tutorial.java

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

public class Tutorial { 
   private int tutorial_id; 
   private String tutorial_title; 
   private String tutorial_author; 
   private String submission_date; 
  
   public int getTutorial_id() { 
      return tutorial_id; 
   }  
   
   public void setTutorial_id(int tutorial_id) { 
      this.tutorial_id = tutorial_id; 
   }
   
   public String getTutorial_title() { 
      return tutorial_title; 
   }   
 
   public void setTutorial_title(String tutorial_title) { 
      this.tutorial_title = tutorial_title; 
   }  
   
   public String getTutorial_author() { 
      return tutorial_author; 
   }  
 
   public void setTutorial_author(String tutorial_author) { 
      this.tutorial_author = tutorial_author; 
   }  
 
   public String getSubmission_date() { 
      return submission_date; 
   }  
   public void setSubmission_date(String submission_date) { 
      this.submission_date = submission_date; 
   }  
 
   @Override 
   public String toString() { 
      return " [id=" + tutorial_id + ", title=" + 
      tutorial_title                      + ", 
      author=" + tutorial_author + ", date=" + 
      submission_date + "]"; 
   } 
}    

App.java

Ниже приведен код, который запускает пакетный процесс. В этом классе мы запустим пакетное приложение, запустив JobLauncher.

import org.springframework.batch.core.Job; 
import org.springframework.batch.core.JobExecution; 
import org.springframework.batch.core.JobParameters; 
import org.springframework.batch.core.launch.JobLauncher; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext;  

public class App {  
   
   public static void main(String[] args) throws Exception { 
     
      String[] springConfig  =  { "jobs/job_hello_world.xml" };  
      
      // Creating the application context object  
      ApplicationContext context = new ClassPathXmlApplicationContext(springConfig);  
      
      // Creating the job launcher 
      JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher"); 
    
      // Creating the job 
      Job job = (Job) context.getBean("helloWorldJob"); 
    
      // Executing the JOB 
      JobExecution execution = jobLauncher.run(job, new JobParameters()); 
      System.out.println("Exit Status : " + execution.getStatus()); 
   } 
}

При выполнении этого приложения оно выдаст следующий вывод.

May 09, 2017 5:44:48 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 
INFO: Refreshing org.springframework.context.support.ClassPathXml
ApplicationContext@3d646c37: startup date [Tue May 
09 17:44:48 IST 2017]; root of context hierarchy 
May 09, 2017 5:44:48 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
May 09, 2017 5:44:56 PM org.springframework.batch.core.launch.support.SimpleJobLauncher run 
INFO: Job: [FlowJob: [name=helloWorldJob]] launched 
with the following parameters: [{}] 
May 09, 2017 5:44:56 PM org.springframework.batch.core.job.SimpleStepHandler handleStep 
INFO: Executing step: [step1] 
Processing ...Report [id=101, title=Learn Java, author=Sanjay, date=06-05-2007] 
Processing ...Report [id=102, title=Learn MySQL, author=Abdul S, date=19-04-2007] 
Processing ...Report [id=103, title=Learn JavaFX, author=Krishna Kasyap, date=0607-2017] 
May 09, 2017 5:44:57 PM org.springframework.batch.core.launch.support.SimpleJobLauncher run 
INFO: Job: [FlowJob: [name=helloWorldJob]] completed with the following parameters: 
[{}] and the following status: [COMPLETED] 
Hello 
Exit Status : COMPLETED 

Это создаст файл .txt со следующим содержимым.