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

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

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

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

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

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

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

Что такое Spring Batch

Весенняя партия - это lightweight framework который используется для разработки Batch Applications которые используются в корпоративных приложениях.

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

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

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

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

Ниже приведены примечательные особенности Spring Batch:

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

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

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

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

    • Параллельно выполнять один поток.

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

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

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

В дополнение к этому, приложения Spring Batch поддерживают -

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

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

  • Для выполнения одновременных заданий.

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

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

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

Установка Spring Batch на Eclipse

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

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

Step 2 - Создайте образец проекта Spring Batch, как показано ниже.

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

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

<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 файлы были загружены.

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

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

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

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

Компоненты 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. В этих тегах мы определяем определение и порядок шагов.

Restartable - Как правило, когда задание выполняется, и мы пытаемся запустить его снова, это считается restartи он будет запущен снова. Чтобы этого не произошло, нужно установитьrestartable ценность для false как показано ниже.

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

</job>

Шаг

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

Как указано на схеме, каждый шаг состоит из ItemReader, ItemProcessor (необязательно) и ItemWriter. A job may contain one or more steps.

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

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

An Item processor- это класс, содержащий код обработки, который обрабатывает данные, считанные в пакете Spring. Если в приложении написано"n" записей, то код в процессоре будет выполняться для каждой записи.

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

  • А reader который читает из базы данных MySQL.

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

  • А custom processor который обрабатывает данные по нашему желанию.

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

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

JobRepository

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

<job-repository id = "jobRepository"/>

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

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

In-Memory Repository - В случае, если вы не хотите сохранять объекты домена Spring Batch в базе данных, вы можете настроить версию jobRepository в памяти, как показано ниже.

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

JobLauncher

JobLauncher - это интерфейс, который запускает задание Spring Batch с given set of parameters. SampleJoblauncher это класс, который реализует JobLauncherинтерфейс. Ниже приведена конфигурация JobLauncher.

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

JobInstance

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

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

JobExecution и StepExecution

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

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

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

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

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

  • В job и step определения.

  • Бобы, определяющие readers и writers.

  • Определение таких компонентов, как JobLauncher, JobRepository, Transaction Manager и Data Source.

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

Класс картографа

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

Класс Java Bean

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

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

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

Класс лаунчера

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

При написании приложения Spring Batch мы настроим задание, шаг, JobLauncher, JobRepository, Transaction Manager, средства чтения и записи, используя теги 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

Id

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

2

restartable

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

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

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

Шаг

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

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

Id

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

2

next

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

3

parent

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

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

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

Кусок

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

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

reader

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

2

writer

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

3

processor

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

4

commit-interval

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

Ниже приведена 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 с использованием реляционной базы данных. Этот bean-компонент связан с классом типаorg.springframework.batch.core.repository.JobRepository.

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

dataSource

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

2

transactionManager

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

3

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(в наших программах). У этого bean-компонента есть одно свойство с именемjobrepository, и он используется для указания имени компонента, который определяет jobrepository.

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

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

TransactionManager

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

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

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

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

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

driverClassName

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

2

url

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

3

username

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

4

password

Это указывает пароль для подключения к базе данных.

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

<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>

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

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

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

<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, плоских файлов, CSV и т. Д.

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

ItemReader

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

Ниже приведены некоторые из предопределенных классов 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

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

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

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

Таким же образом нам нужно настроить ItemWriters, создав bean-компоненты. Ниже приводится пример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 используется для обработки данных. Когда данный элемент недействителен, он возвращаетсяnull, иначе он обрабатывает данный элемент и возвращает обработанный результат. ИнтерфейсItemProcessor<I,O> представляет процессор.

Tasklet class - Когда нет reader и writerприведены, Tasklet действует как процессор для 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. Он просто выполнитtasklet для отображения сообщения.

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

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

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

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

  • Launcher class - в этом классе мы запустим пакетное приложение, запустив средство запуска заданий.

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 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 - The writer мы используем в приложении JdbcBatchItemWriterдля записи данных в базу данных MySQL. Предположим, мы создали таблицу в MySQL внутри базы данных с именем"details".

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) 
);

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

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

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

jobConfig.xml

Ниже приведен файл конфигурации нашего образца приложения Spring Batch. В этом файле мы определим задание и шаги. В дополнение к ним мы также определяем bean-компоненты для 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

Ниже приводится processorкласс. В этом классе мы пишем код обработки в приложении. Здесь мы загружаем 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

Ниже приводится Tutorialкласс. Это простой класс сsetter и getter методы.

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 учебник _description
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 - самая популярная система управления реляционными базами данных SQL с открытым исходным кодом. MySQL - одна из лучших СУБД, используемых для разработки веб-приложений. Это руководство поможет вам быстро начать работу с MySQL и научит вас программировать на MySQL.
1003 Изучите JavaFX Кришна Кашьяп 06-07-2017 https: // www. tutorialspoint.com / javafx / images / javafx-minilogo.jpg MySQL - самая популярная система управления реляционными базами данных SQL с открытым исходным кодом. MySQL - одна из лучших СУБД, используемых для разработки веб-приложений. Это руководство поможет вам быстро начать работу с MySQL и научит вас программировать на MySQL.

Будет создан PDF-файл с записями на каждой странице, как показано ниже.

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

Reader - The 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.

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

jobConfig.xml

Ниже приведен файл конфигурации нашего образца приложения Spring Batch. В этом файле мы определим задание и шаги. В дополнение к ним мы также определяем bean-компоненты для 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

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

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 класс

Ниже приводится Tutorialкласс. Это простой класс Java сsetter и getterметоды. В этом классе мы используем аннотации, чтобы связать методы этого класса с тегами 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.

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-файл.

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

jobConfig.xml

Ниже приведен файл конфигурации нашего образца приложения Spring Batch. В этом файле мы определим задание и шаги. В дополнение к ним мы также определяем bean-компоненты для 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

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

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

Ниже приводится Tutorialкласс. Это простой класс Java сsetter и getterметоды. В этом классе мы используем аннотации, чтобы связать методы этого класса с тегами 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 Reader и Flatfile Писатель (.txt).

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 записать данные в flatfile (.текст).

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

jobConfig.xml

Ниже приведен файл конфигурации нашего образца приложения Spring Batch. В этом файле мы определим задание и шаги. В дополнение к ним мы также определяем bean-компоненты для 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

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

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

Ниже приводится Tutorialкласс. Это простой класс Java сsetter и getterметоды. В этом классе мы используем аннотации, чтобы связать методы этого класса с тегами 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 файл со следующим содержимым.

Report [id=101, title=Learn Java, author=Sanjay, date=06-05-2007] 
Report [id=102, title=Learn MySQL, author=Abdul S, date=19-04-2007] 
Report [id=103, title=Learn JavaFX, author=Krishna Kasyap, date=06-07-2017]