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]