Spring Batch - Panduan Cepat

Batch processingadalah mode pemrosesan yang melibatkan pelaksanaan serangkaian pekerjaan kompleks otomatis tanpa interaksi pengguna. Proses batch menangani data massal dan berjalan untuk waktu yang lama.

Beberapa aplikasi Perusahaan perlu memproses data besar untuk melakukan operasi yang melibatkan -

  • Peristiwa berbasis waktu seperti penghitungan berkala.

  • Aplikasi periodik yang diproses secara berulang melalui kumpulan data yang besar.

  • Aplikasi yang berhubungan dengan pemrosesan dan validasi data yang tersedia secara transaksional.

Oleh karena itu, pemrosesan batch digunakan dalam aplikasi perusahaan untuk melakukan transaksi tersebut.

Apa itu Spring Batch

Batch musim semi adalah lightweight framework yang digunakan untuk berkembang Batch Applications yang digunakan di Aplikasi Perusahaan.

Selain pemrosesan massal, kerangka kerja ini menyediakan fungsi untuk -

  • Termasuk logging dan tracing
  • Pengelolaan transaksi
  • Statistik pemrosesan pekerjaan
  • Pekerjaan dimulai ulang
  • Lewati dan Manajemen sumber daya

Anda juga dapat menskalakan aplikasi batch pegas menggunakan teknik pembagiannya.

Fitur Spring Batch

Berikut adalah fitur-fitur penting dari Spring Batch -

  • Flexibility- Aplikasi Spring Batch fleksibel. Anda hanya perlu mengubah file XML untuk mengubah urutan pemrosesan dalam aplikasi.

  • Maintainability- Aplikasi Spring Batch mudah dirawat. Pekerjaan Spring Batch mencakup langkah-langkah dan setiap langkah dapat dipisahkan, diuji, dan diperbarui, tanpa memengaruhi langkah-langkah lainnya.

  • Scalability- Dengan menggunakan teknik pembagian, Anda dapat mengatur skala aplikasi Spring Batch. Teknik ini memungkinkan Anda untuk -

    • Jalankan langkah-langkah pekerjaan secara paralel.

    • Jalankan utas tunggal secara paralel.

  • Reliability - Jika terjadi kegagalan, Anda dapat memulai ulang pekerjaan tepat dari tempatnya dihentikan, dengan memisahkan langkah-langkahnya.

  • Support for multiple file formats - Spring Batch menyediakan dukungan untuk banyak pembaca dan penulis seperti XML, Flat file, CSV, MYSQL, Hibernate, JDBC, Mongo, Neo4j, dll.

  • Multiple ways to launch a job - Anda dapat meluncurkan pekerjaan Spring Batch menggunakan aplikasi web, program Java, Command Line, dll.

Selain itu, aplikasi Spring Batch mendukung -

  • Coba lagi otomatis setelah gagal.

  • Melacak status dan statistik selama eksekusi batch dan setelah menyelesaikan pemrosesan batch.

  • Untuk menjalankan pekerjaan bersamaan.

  • Layanan seperti logging, pengelolaan sumber daya, lewati, dan mulai ulang pemrosesan.

Dalam bab ini, kami akan menjelaskan cara menyetel lingkungan Spring Batch di Eclipse IDE. Sebelum melanjutkan dengan penginstalan, pastikan Anda telah menginstal Eclipse di sistem Anda. Jika tidak, unduh dan instal Eclipse di sistem Anda.

Untuk informasi lebih lanjut tentang Eclipse, silakan lihat Tutorial Eclipse kami .

Menyetel Spring Batch di Eclipse

Ikuti langkah-langkah yang diberikan di bawah ini untuk mengatur lingkungan Spring Batch di Eclipse.

Step 1 - Instal Eclipse dan buka Proyek Baru seperti yang ditunjukkan pada tangkapan layar berikut.

Step 2 - Buat proyek Sample Spring Batch seperti yang ditunjukkan di bawah ini.

Step 3- Klik kanan pada proyek tersebut dan ubah menjadi proyek Maven seperti yang ditunjukkan di bawah ini. Setelah Anda mengubahnya menjadi proyek Maven, itu akan memberi Anda filePom.xmldi mana Anda perlu menyebutkan dependensi yang diperlukan. Setelah itu,jar file tersebut akan secara otomatis diunduh ke proyek Anda.

Step 4 - Sekarang, di pom.xml dari proyek, salin dan tempel konten berikut (ketergantungan untuk aplikasi batch pegas) dan segarkan proyek.

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

Akhirnya, jika Anda mengamati dependensi Maven, Anda dapat mengamati semua yang diperlukan jar file telah diunduh.

Berikut adalah diagram representasi dari arsitektur Spring Batch. Seperti yang digambarkan pada gambar, arsitektur mengandung tiga komponen utama yaitu,Application, Batch Core, dan Batch Infrastructure.

Application - Komponen ini berisi semua pekerjaan dan kode yang kita tulis menggunakan kerangka kerja Spring Batch.

Batch Core - Komponen ini berisi semua kelas API yang diperlukan untuk mengontrol dan meluncurkan Pekerjaan Batch.

Batch Infrastructure - Komponen ini berisi pembaca, penulis, dan layanan yang digunakan oleh aplikasi dan komponen inti Batch.

Komponen Spring Batch

Ilustrasi berikut menunjukkan berbagai komponen Spring Batch dan bagaimana mereka terhubung satu sama lain.

Pekerjaan

Dalam aplikasi Spring Batch, pekerjaan adalah proses batch yang akan dijalankan. Ini berjalan dari awal hingga akhir tanpa gangguan. Pekerjaan ini selanjutnya dibagi menjadi beberapa langkah (atau pekerjaan berisi langkah-langkah).

Kami akan mengonfigurasi pekerjaan di Spring Batch menggunakan file XML atau kelas Java. Berikut adalah konfigurasi XML Job di Spring Batch.

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

Pekerjaan batch dikonfigurasi di dalam tag <job> </job>. Ini memiliki atribut bernamaid. Dalam tag ini, kami mendefinisikan definisi dan urutan langkah-langkahnya.

Restartable - Secara umum, saat pekerjaan sedang berjalan dan kami mencoba memulainya lagi yang dianggap sebagai restartdan itu akan dimulai lagi. Untuk menghindarinya, Anda perlu menyetelrestartable nilai untuk false seperti gambar dibawah.

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

</job>

Langkah

SEBUAH step adalah bagian independen dari pekerjaan yang berisi informasi yang diperlukan untuk menentukan dan melaksanakan pekerjaan (bagiannya).

Seperti yang ditentukan dalam diagram, setiap langkah terdiri dari ItemReader, ItemProcessor (opsional) dan ItemWriter. A job may contain one or more steps.

Pembaca, Penulis, dan Prosesor

Sebuah item reader membaca data ke dalam aplikasi Batch Musim Semi dari sumber tertentu, sedangkan item writer menulis data dari aplikasi Spring Batch ke tujuan tertentu.

Sebuah Item processoradalah kelas yang berisi kode pemrosesan yang memproses data yang dibaca ke dalam batch pegas. Jika aplikasi membaca"n" catatan, maka kode dalam prosesor akan dieksekusi pada setiap catatan.

Jika tidak ada pembaca dan penulis yang diberikan, a taskletbertindak sebagai prosesor untuk SpringBatch. Ini hanya memproses satu tugas. Misalnya, jika kita sedang menulis pekerjaan dengan langkah sederhana di mana kita membaca data dari database MySQL dan memprosesnya dan menulisnya ke file (flat), maka langkah kita menggunakan -

  • SEBUAH reader yang dibaca dari database MySQL.

  • SEBUAH writer yang menulis ke file datar.

  • SEBUAH custom processor yang memproses data sesuai keinginan kita.

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

Spring Batch menyediakan daftar panjang readers dan writers. Dengan menggunakan kelas yang telah ditentukan ini, kita dapat mendefinisikan kacang untuk mereka. Kami akan membahasreaders dan writers secara lebih rinci di bab-bab selanjutnya.

JobRepository

Repositori Job di Spring Batch menyediakan operasi Buat, Ambil, Perbarui, dan Hapus (CRUD) untuk implementasi JobLauncher, Pekerjaan, dan Langkah. Kami akan mendefinisikan repositori pekerjaan dalam file XML seperti yang ditunjukkan di bawah ini.

<job-repository id = "jobRepository"/>

Sebagai tambahannya id, ada beberapa opsi lagi (opsional) yang tersedia. Berikut adalah konfigurasi repositori pekerjaan dengan semua opsi dan nilai defaultnya.

<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 - Jika Anda tidak ingin mempertahankan objek domain Spring Batch dalam database, Anda dapat mengonfigurasi versi jobRepository dalam memori seperti yang ditunjukkan di bawah ini.

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

JobLauncher

JobLauncher adalah antarmuka yang meluncurkan tugas Spring Batch dengan ekstensi given set of parameters. SampleJoblauncher adalah kelas yang mengimplementasikan JobLauncherantarmuka. Berikut adalah konfigurasi JobLauncher.

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

JobInstance

SEBUAH JobInstancemewakili jalannya pekerjaan yang logis; itu dibuat saat kita menjalankan pekerjaan. Setiap instance pekerjaan dibedakan berdasarkan nama pekerjaan dan parameter yang diteruskan padanya saat berjalan.

Jika eksekusi JobInstance gagal, JobInstance yang sama dapat dijalankan lagi. Karenanya, setiap JobInstance dapat memiliki beberapa eksekusi pekerjaan.

JobExecution dan StepExecution

JobExecution dan StepExecution merupakan representasi dari eksekusi sebuah pekerjaan / langkah. Mereka berisi informasi jalannya pekerjaan / langkah seperti waktu mulai (pekerjaan / langkah), waktu akhir (pekerjaan / langkah).

Hampir semua contoh dalam tutorial ini berisi file-file berikut -

  • File konfigurasi (file XML)
  • Tasklet / prosesor (kelas Java)
  • Kelas Java dengan setter dan getter (kelas Java (kacang))
  • Kelas mapper (kelas Java)
  • Kelas peluncur (kelas Java)

File Konfigurasi

File konfigurasi (XML) berisi berikut ini -

  • Itu job dan step definisi.

  • Mendefinisikan kacang readers dan writers.

  • Definisi komponen seperti JobLauncher, JobRepository, Transaction Manager, dan Sumber Data.

Dalam contoh kami, untuk pemahaman yang lebih baik, kami telah membaginya menjadi dua file job.xml file (mendefinisikan pekerjaan, langkah, pembaca dan penulis) dan context.xml file (peluncur pekerjaan, repositori pekerjaan, manajer transaksi dan sumber data).

Kelas Mapper

Kelas Mapper, bergantung pada pembacanya, mengimplementasikan antarmuka seperti row mapper, field set mapper, dll. Berisi kode untuk mendapatkan data dari pembaca dan mengaturnya ke kelas Java dengan setter dan getter metode (Java Bean).

Kelas Kacang Java

Kelas Java dengan setters dan getters(Java bean) merepresentasikan data dengan banyak nilai. Bertindak sebagai kelas pembantu. Kami akan mengirimkan data dari satu komponen (pembaca, penulis, pemroses) ke yang lain dalam bentuk objek kelas ini.

Tasklet / prosesor

Kelas Tasklet / prosesor berisi kode pemrosesan aplikasi Spring Batch. Prosesor adalah kelas yang menerima objek yang berisi data yang dibaca, memprosesnya, dan mengembalikan data yang telah diproses (dalam bentuk objek).

Kelas peluncur

Kelas ini (App.java) berisi kode untuk meluncurkan aplikasi Spring Batch.

Saat menulis aplikasi Spring Batch, kami akan mengonfigurasi pekerjaan, langkah, JobLauncher, JobRepository, Manajer Transaksi, pembaca, dan penulis menggunakan tag XML yang disediakan di namespace Spring Batch. Oleh karena itu, Anda perlu menyertakan namespace ini dalam file XML Anda seperti yang ditunjukkan di bawah ini.

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

Pada bagian berikut, kita akan membahas berbagai tag, atribut, dan contohnya, yang tersedia di namespace Spring Batch.

Pekerjaan

Tag ini digunakan untuk menentukan / mengkonfigurasi pekerjaan SpringBatch. Ini berisi serangkaian langkah dan dapat diluncurkan menggunakan JobLauncher.

Tag ini memiliki 2 atribut seperti yang tercantum di bawah ini -

S.No Atribut & Deskripsi
1

Id

Ini adalah Id pekerjaan, wajib untuk menentukan nilai atribut ini.

2

restartable

Ini adalah atribut yang digunakan untuk menentukan apakah pekerjaan dapat direstart atau tidak. Atribut ini opsional.

Berikut ini adalah konfigurasi XML pekerjaan SpringBatch.

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

Langkah

Tag ini digunakan untuk menentukan / mengkonfigurasi langkah-langkah pekerjaan SpringBatch. Ini memiliki tiga atribut berikut -

S.No Atribut & Deskripsi
1

Id

Ini adalah Id pekerjaan, wajib untuk menentukan nilai atribut ini.

2

next

Ini adalah jalan pintas untuk menentukan langkah selanjutnya.

3

parent

Ini digunakan untuk menentukan nama kacang induk dari mana konfigurasi harus mewarisi.

Berikut adalah konfigurasi XML dari langkah SpringBatch.

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

Bingkah

Tag ini digunakan untuk mendefinisikan / mengkonfigurasi potongan dari a tasklet. Ini memiliki empat atribut berikut -

S.No Atribut & Deskripsi
1

reader

Ini mewakili nama kacang pembaca item. Ini menerima nilai tipeorg.springframework.batch.item.ItemReader.

2

writer

Ini mewakili nama kacang pembaca item. Ini menerima nilai tipeorg.springframework.batch.item.ItemWriter.

3

processor

Ini mewakili nama kacang pembaca item. Ini menerima nilai tipeorg.springframework.batch.item.ItemProcessor.

4

commit-interval

Ini digunakan untuk menentukan jumlah item yang akan diproses sebelum melakukan transaksi.

Berikut ini adalah konfigurasi XML dari potongan 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 Bean digunakan untuk mengkonfigurasi JobRepository menggunakan database relasional. Kacang ini dikaitkan dengan kelas tipeorg.springframework.batch.core.repository.JobRepository.

S.No Atribut & Deskripsi
1

dataSource

Ini digunakan untuk menentukan nama kacang yang mendefinisikan sumber data.

2

transactionManager

Ini digunakan untuk menentukan nama kacang yang mendefinisikan manajer transaksi.

3

databaseType

Ini menentukan jenis database relasional yang digunakan dalam repositori pekerjaan.

Berikut adalah contoh konfigurasi 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

Kacang JobLauncher digunakan untuk mengkonfigurasi JobLauncher. Itu terkait dengan kelasorg.springframework.batch.core.launch.support.SimpleJobLauncher(dalam program kami). Kacang ini memiliki satu properti bernamajobrepository, dan digunakan untuk menentukan nama kacang yang mendefinisikan file jobrepository.

Berikut adalah contoh konfigurasi jobLauncher.

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

TransactionManager

Kacang TransactionManager digunakan untuk mengkonfigurasi TransactionManager menggunakan database relasional. Kacang ini dikaitkan dengan kelas tipeorg.springframework.transaction.platform.TransactionManager.

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

Sumber data

Kacang sumber data digunakan untuk mengkonfigurasi file Datasource. Kacang ini dikaitkan dengan kelas tipeorg.springframework.jdbc.datasource.DriverManagerDataSource.

S.No Atribut & Deskripsi
1

driverClassName

Ini menentukan nama kelas dari driver yang digunakan untuk terhubung dengan database.

2

url

Ini menentukan URL database.

3

username

Ini menentukan nama pengguna untuk terhubung dengan database.

4

password

Ini menentukan kata sandi untuk terhubung dengan database.

Berikut adalah contoh konfigurasi file 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>

Sebuah Item Reader membaca data ke dalam aplikasi batch pegas dari sumber tertentu, sedangkan file Item Writer menulis data dari aplikasi Spring Batch ke tujuan tertentu.

Sebuah Item processoradalah kelas yang berisi kode pemrosesan yang memproses data yang dibaca ke batch pegas. Jika aplikasi membaca n catatan kode di prosesor akan dijalankan pada setiap catatan.

SEBUAH chunk adalah elemen anak dari tasklet. Ini digunakan untuk melakukan operasi baca, tulis, dan pemrosesan. Kita dapat mengkonfigurasi pembaca, penulis, dan prosesor menggunakan elemen ini, dengan langkah seperti yang ditunjukkan di bawah ini.

<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 menyediakan pembaca dan penulis untuk membaca dan menulis data dari berbagai sistem file / database seperti MongoDB, Neo4j, MySQL, XML, flatfile, CSV, dll.

Untuk menyertakan pembaca dalam aplikasi Anda, Anda perlu mendefinisikan kacang untuk pembaca itu, memberikan nilai ke semua properti yang diperlukan di dalam kacang, dan meneruskan id kacang tersebut sebagai nilai untuk atribut elemen potongan reader (sama untuk writer).

ItemReader

Ini adalah entitas dari langkah (dari proses batch) yang membaca data. ItemReader membaca satu item dalam satu waktu. Spring Batch menyediakan InterfaceItemReader. Semuareaders menerapkan antarmuka ini.

Berikut adalah beberapa kelas ItemReader standar yang disediakan oleh Spring Batch untuk dibaca dari berbagai sumber.

Pembaca Tujuan
FlatFIleItemReader Untuk membaca data dari file datar.
StaxEventItemReader Untuk membaca data dari file XML.
StoredProcedureItemReader Untuk membaca data dari prosedur tersimpan database.
JDBCPagingItemReader Untuk membaca data dari database database relasional.
MongoItemReader Untuk membaca data dari MongoDB.
Neo4jItemReader Untuk membaca data dari Neo4jItemReader.

Kita perlu mengkonfigurasi file ItemReadersdengan membuat kacang. Berikut adalah contoh dariStaxEventItemReader yang membaca data dari file 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>

Seperti yang diamati, saat mengonfigurasi, kita perlu menentukan nama kelas masing-masing dari pembaca yang diperlukan dan kita perlu memberikan nilai ke semua properti yang diperlukan.

ItemWriter

Ini adalah elemen dari stepdari proses batch yang menulis data. ItemWriter menulis satu item setiap kali. Spring Batch menyediakan InterfaceItemWriter. Semua penulis mengimplementasikan antarmuka ini.

Berikut adalah beberapa kelas ItemWriter standar yang disediakan oleh Spring Batch untuk dibaca dari berbagai sumber.

Penulis Tujuan
FlatFIleItemWriter Untuk menulis data menjadi file datar.
StaxEventItemWriter Untuk menulis data ke dalam file XML.
StoredProcedureItemWriter Untuk menulis data ke dalam prosedur tersimpan database.
JDBCPagingItemWriter Untuk menulis data ke dalam database database relasional.
MongoItemWriter Untuk menulis data ke MongoDB.
Neo4jItemWriter Untuk menulis data ke Neo4j.

Dengan cara yang sama, kita perlu mengkonfigurasi ItemWriters dengan membuat kacang. Berikut adalah contoh dariJdbcCursorItemReader yang menulis data ke database 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>

Prosesor Barang

ItemProcessor: ItemProcessor digunakan untuk memproses data. Ketika item yang diberikan tidak valid, ia kembalinull, jika tidak, ia memproses item yang diberikan dan mengembalikan hasil yang diproses. AntarmukaItemProcessor<I,O> mewakili prosesor.

Tasklet class - Saat tidak reader dan writerdiberikan, Tasklet bertindak sebagai prosesor untuk SpringBatch. Ini hanya memproses tugas tunggal.

Kita dapat menentukan prosesor item kustom dengan mengimplementasikan antarmuka ItemProcessor dari paket org.springframework.batch.item.ItemProcessor. Kelas ItemProcessor ini menerima objek dan memproses data dan mengembalikan data yang diproses sebagai objek lain.

Dalam proses batch, jika "n"record atau elemen data dibaca, kemudian untuk setiap record akan membaca data, mengolahnya, dan menulis data di penulis. Untuk mengolah data tersebut, relay dilewatkan pada prosesor.

Misalnya, Anda telah menulis kode untuk memuat dokumen PDF tertentu, membuat halaman baru, menulis item data ke PDF dalam format tabel. Jika Anda menjalankan aplikasi ini, aplikasi membaca semua item data dari dokumen XML, menyimpannya dalam database MySQL, dan mencetaknya dalam dokumen PDF yang diberikan di halaman individual.

Contoh

Berikut ini adalah contoh kelas 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; 
   } 
}

Bab ini menunjukkan aplikasi Spring Batch dasar. Ini hanya akan mengeksekusi filetasklet untuk menampilkan pesan.

Aplikasi Spring Batch kami berisi file-file berikut -

  • Configuration file- Ini adalah file XML tempat kami mendefinisikan Pekerjaan dan langkah-langkah pekerjaan. (Jika aplikasi melibatkan pembaca dan penulis juga, maka konfigurasireaders dan writers juga disertakan dalam file ini.)

  • Context.xml - Dalam file ini, kita akan mendefinisikan kacang seperti repositori pekerjaan, peluncur pekerjaan dan manajer transaksi.

  • Tasklet class - Di kelas ini, kita akan menulis pekerjaan kode pemrosesan (Dalam hal ini, ini menampilkan pesan sederhana)

  • Launcher class - di kelas ini, kami akan meluncurkan Aplikasi Batch dengan menjalankan peluncur Pekerjaan.

jobConfig.xml

Berikut adalah file konfigurasi contoh aplikasi Spring Batch kami.

<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

Berikut ini adalah context.xml aplikasi Spring Batch kami.

<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

Berikut adalah kelas Tasklet yang menampilkan pesan sederhana.

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

Berikut adalah kode yang meluncurkan proses batch.

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

Saat menjalankan, program SpringBatch di atas akan menghasilkan keluaran berikut -

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

Pada bab ini, kita akan membuat aplikasi Spring Batch yang menggunakan XML Reader dan MySQL Writer.

Reader - Pembaca yang kami gunakan dalam aplikasi ini StaxEventItemReader untuk membaca data dari dokumen XML.

Berikut adalah input dokumen XML yang kami gunakan dalam aplikasi ini. Dokumen ini menyimpan catatan data yang menentukan detail seperti id tutorial, penulis tutorial, judul tutorial, tanggal pengiriman, ikon tutorial, dan deskripsi tutorial.

<?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 - Itu writer kami gunakan dalam aplikasi ini JdbcBatchItemWriteruntuk menulis data ke database MySQL. Asumsikan kita telah membuat tabel di MySQL di dalam database bernama"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 - Prosesor yang kami gunakan dalam aplikasi ini adalah prosesor khusus yang menulis data dari setiap catatan pada dokumen PDF.

Dalam proses batch, jika "n"record atau elemen data dibaca, kemudian untuk setiap record akan membaca data, mengolahnya, dan menulis data di Writer. Untuk mengolah data tersebut, relay dilewatkan pada prosesor. Dalam kasus ini, di kelas prosesor khusus, kami telah menulis kode untuk memuat dokumen PDF tertentu, membuat halaman baru, menulis item data ke PDF dalam format tabel.

Terakhir, jika Anda menjalankan aplikasi ini, aplikasi membaca semua item data dari dokumen XML, menyimpannya di database MySQL, dan mencetaknya di dokumen PDF yang diberikan di halaman individual.

jobConfig.xml

Berikut adalah file konfigurasi contoh aplikasi Spring Batch kami. Dalam file ini, kami akan menentukan Pekerjaan dan langkah-langkahnya. Selain itu, kami juga mendefinisikan kacang untuk ItemReader, ItemProcessor, dan ItemWriter. (Di sini, kami mengaitkannya dengan kelasnya masing-masing dan meneruskan nilai untuk properti yang diperlukan untuk mengkonfigurasinya.)

<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

Berikut ini adalah context.xmlaplikasi Spring Batch kami. Dalam file ini, kami akan mendefinisikan kacang seperti repositori pekerjaan, peluncur pekerjaan, dan manajer transaksi.

<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

Berikut ini adalah processorkelas. Di kelas ini, kami menulis kode pemrosesan dalam aplikasi. Di sini, kami memuat dokumen PDF, membuat halaman baru, membuat tabel, dan memasukkan nilai-nilai berikut untuk setiap record: id tutorial, nama tutorial, penulis, tanggal pengiriman dalam tabel.

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

Berikut adalah kelas ReportFieldSetMapper yang menetapkan data ke kelas 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

Berikut ini adalah Tutorialkelas. Ini adalah kelas sederhana dengansetter dan getter metode.

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

Berikut adalah kode yang meluncurkan proses batch. Di kelas ini, kami akan meluncurkan Aplikasi Batch dengan menjalankan 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()); 
   }    
}

Saat menjalankan aplikasi ini, akan dihasilkan keluaran sebagai berikut.

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

Jika Anda memverifikasi details.tutorial tabel dalam database, ini akan menunjukkan output berikut -

tutorial _id tutorial _author tutorial _title tanggal penyerahan tutorial _icon tutorial _description
1001 Sanjay Pelajari Java 06-05-2007 https: //www.tutorials point.com / java / images / java-mini-logo.jpg Java adalah bahasa pemrograman tingkat tinggi yang awalnya dikembangkan oleh Sun Microsystems dan dirilis pada tahun 1995. Java berjalan pada berbagai platform. Tutorial ini memberikan pemahaman lengkap tentang Java.
1002 Abdul S Pelajari MySQL 19-04-2007 https: // www. tutorialspoint.com / mysql / images /mysql-minilogo.jpg MySQL adalah sistem manajemen database Open Source Relational SQL yang paling populer. MySQL adalah salah satu RDBMS terbaik yang digunakan untuk mengembangkan aplikasi perangkat lunak berbasis web. Tutorial ini akan membantu Anda memulai dengan cepat dengan MySQL dan membuat Anda nyaman dengan pemrograman MySQL.
1003 Pelajari JavaFX Krishna Kasyap 06-07-2017 https: // www. tutorialspoint.com / javafx / images / javafx-minilogo.jpg MySQL adalah sistem manajemen database Open Source Relational SQL yang paling populer. MySQL adalah salah satu RDBMS terbaik yang digunakan untuk mengembangkan aplikasi perangkat lunak berbasis web. Tutorial ini akan membantu Anda memulai dengan cepat dengan MySQL dan membuat Anda nyaman dengan pemrograman MySQL.

Ini akan menghasilkan PDF dengan catatan di setiap halaman seperti yang ditunjukkan di bawah ini.

Pada bab ini, kita akan membuat aplikasi Spring Batch sederhana yang menggunakan CSV Reader dan XML Writer.

Reader - Itu reader kami gunakan dalam aplikasi ini FlatFileItemReader untuk membaca data dari file CSV.

Berikut adalah input file CSV yang kami gunakan dalam aplikasi ini. Dokumen ini menyimpan catatan data yang menentukan detail seperti id tutorial, penulis tutorial, judul tutorial, tanggal pengiriman, ikon tutorial dan deskripsi tutorial.

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

Writer - Penulis yang kami gunakan dalam aplikasi ini StaxEventItemWriter untuk menulis data ke file XML.

Processor - Prosesor yang kami gunakan dalam aplikasi ini adalah prosesor khusus yang hanya mencetak catatan yang dibaca dari file CSV.

jobConfig.xml

Berikut adalah file konfigurasi contoh aplikasi Spring Batch kami. Dalam file ini, kami akan menentukan Pekerjaan dan langkah-langkahnya. Selain itu, kami juga mendefinisikan kacang untuk ItemReader, ItemProcessor, dan ItemWriter. (Di sini, kami mengaitkannya dengan kelas masing-masing dan meneruskan nilai untuk properti yang diperlukan untuk mengkonfigurasinya.)

<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

Berikut ini adalah context.xmlaplikasi Spring Batch kami. Dalam file ini, kami akan mendefinisikan kacang seperti repositori pekerjaan, peluncur pekerjaan, dan manajer transaksi.

<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

Berikut ini adalah kelas Prosesor. Di kelas ini, kami menulis kode pemrosesan dalam aplikasi. Di sini, kami mencetak konten dari setiap record.

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

Berikut ini adalah kelas TutorialFieldSetMapper yang menetapkan data ke kelas 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; 
   } 
}

Kelas Tutorial.java

Berikut ini adalah Tutorialkelas. Ini adalah kelas Java sederhana dengansetter dan gettermetode. Di kelas ini, kami menggunakan penjelasan untuk mengaitkan metode kelas ini dengan tag file 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

Berikut ini adalah kode yang meluncurkan proses batch. Di kelas ini, kami akan meluncurkan aplikasi batch dengan menjalankan 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()); 
   } 
}

Saat menjalankan aplikasi ini, akan dihasilkan keluaran sebagai berikut.

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

Ini akan menghasilkan file XML dengan konten berikut.

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

Pada bab ini, kita akan membuat aplikasi Spring Batch yang menggunakan MySQL reader dan XML Writer.

Reader - Pembaca yang kami gunakan dalam aplikasi ini JdbcCursorItemReader untuk membaca data dari database MySQL.

Asumsikan kita telah membuat tabel di database MySQL seperti yang ditunjukkan di bawah ini -

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

Asumsikan kita telah memasukkan record berikut ke dalamnya.

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 - Penulis yang kami gunakan dalam aplikasi ini StaxEventItemWriter untuk menulis data ke file XML.

Processor - Prosesor yang kami gunakan dalam aplikasi ini adalah prosesor khusus yang hanya mencetak catatan yang dibaca dari file CSV.

jobConfig.xml

Berikut adalah file konfigurasi contoh aplikasi Spring Batch kami. Dalam file ini, kami akan menentukan Pekerjaan dan Langkah-langkahnya. Selain itu, kami juga mendefinisikan kacang untuk ItemReader, ItemProcessor, dan ItemWriter. (Di sini, kami mengaitkannya dengan kelasnya masing-masing dan meneruskan nilai untuk properti yang diperlukan untuk mengkonfigurasinya.)

<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

Berikut ini adalah context.xmlaplikasi Spring Batch kami. Dalam file ini, kami akan mendefinisikan kacang seperti repositori pekerjaan, peluncur pekerjaan, dan manajer transaksi.

<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

Berikut ini adalah kelas Prosesor. Di kelas ini, kami menulis kode pemrosesan dalam aplikasi. Di sini, kami mencetak konten dari setiap record.

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

Berikut ini adalah TutorialRowMapper kelas yang menetapkan data ke Tutorial kelas.

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

Berikut ini adalah Tutorialkelas. Ini adalah kelas Java sederhana dengansetter dan gettermetode. Di kelas ini, kami menggunakan penjelasan untuk mengaitkan metode kelas ini dengan tag file 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

Berikut adalah kode yang meluncurkan proses batch. Di kelas ini, kami akan meluncurkan Aplikasi Batch dengan menjalankan 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()); 
   } 
}

Saat menjalankan aplikasi ini, akan dihasilkan keluaran sebagai berikut.

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

Ini akan menghasilkan file XML dengan konten berikut.

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

Pada bab ini, kita akan membuat aplikasi Spring Batch yang menggunakan MySQL Reader dan a Flatfile Penulis (.txt).

Reader - Pembaca yang kami gunakan dalam aplikasi ini JdbcCursorItemReader untuk membaca data dari database MySQL.

Asumsikan kita telah membuat tabel di database MySQL seperti gambar di bawah ini.

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

Asumsikan kita telah memasukkan record berikut ke dalamnya.

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 - Penulis yang kami gunakan dalam aplikasi ini FlatFileItemWriter untuk menulis data flatfile (.txt).

Processor - Prosesor yang kami gunakan dalam aplikasi ini adalah prosesor khusus yang hanya mencetak catatan yang dibaca dari file CSV.

jobConfig.xml

Berikut adalah file konfigurasi contoh aplikasi Spring Batch kami. Dalam file ini, kami akan menentukan Pekerjaan dan Langkah-langkahnya. Selain itu, kami juga mendefinisikan kacang untuk ItemReader, ItemProcessor, dan ItemWriter. (Di sini, kami mengaitkannya dengan kelas masing-masing dan meneruskan nilai untuk properti yang diperlukan untuk mengkonfigurasinya.)

<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

Berikut ini adalah context.xmlaplikasi Spring Batch kami. Dalam file ini, kami akan mendefinisikan kacang seperti repositori pekerjaan, peluncur pekerjaan, dan manajer transaksi.

<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

Berikut ini adalah kelas Prosesor. Di kelas ini, kami menulis kode pemrosesan dalam aplikasi. Di sini, kami mencetak konten dari setiap record.

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

Berikut ini adalah TutorialRowMapper kelas yang menetapkan data ke Tutorial kelas.

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

Berikut ini adalah Tutorialkelas. Ini adalah kelas Java sederhana dengansetter dan gettermetode. Di kelas ini, kami menggunakan penjelasan untuk mengaitkan metode kelas ini dengan tag file 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

Berikut adalah kode yang meluncurkan proses batch. Di kelas ini, kami akan meluncurkan Aplikasi Batch dengan menjalankan 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()); 
   } 
}

Saat menjalankan aplikasi ini, akan dihasilkan keluaran sebagai berikut.

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

Ini akan menghasilkan file .txt file dengan konten berikut.

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]