Spring Batch - Hướng dẫn nhanh

Batch processinglà một chế độ xử lý liên quan đến việc thực hiện một loạt các công việc phức tạp tự động mà không cần sự tương tác của người dùng. Quy trình hàng loạt xử lý dữ liệu hàng loạt và chạy trong một thời gian dài.

Một số ứng dụng Doanh nghiệp yêu cầu xử lý dữ liệu khổng lồ để thực hiện các hoạt động liên quan đến -

  • Các sự kiện dựa trên thời gian như tính toán định kỳ.

  • Các ứng dụng định kỳ được xử lý lặp đi lặp lại trên các tập dữ liệu lớn.

  • Các ứng dụng xử lý và xác thực dữ liệu có sẵn theo cách thức giao dịch.

Do đó, xử lý hàng loạt được sử dụng trong các ứng dụng doanh nghiệp để thực hiện các giao dịch đó.

Spring Batch là gì

Mẻ xuân là một lightweight framework được sử dụng để phát triển Batch Applications được sử dụng trong Ứng dụng Doanh nghiệp.

Ngoài xử lý hàng loạt, khung công tác này cung cấp các chức năng cho -

  • Bao gồm ghi nhật ký và truy tìm
  • Quản lý giao dịch
  • Thống kê xử lý công việc
  • Khởi động lại công việc
  • Bỏ qua và quản lý tài nguyên

Bạn cũng có thể mở rộng quy mô các ứng dụng hàng loạt mùa xuân bằng cách sử dụng các kỹ thuật chia phần của nó.

Đặc điểm của Spring Batch

Sau đây là các tính năng đáng chú ý của Spring Batch -

  • Flexibility- Các ứng dụng Spring Batch rất linh hoạt. Bạn chỉ cần thay đổi tệp XML để thay đổi thứ tự xử lý trong một ứng dụng.

  • Maintainability- Các ứng dụng Spring Batch dễ bảo trì. Công việc Spring Batch bao gồm các bước và mỗi bước có thể được tách riêng, kiểm tra và cập nhật mà không ảnh hưởng đến các bước khác.

  • Scalability- Sử dụng các kỹ thuật phân vùng, bạn có thể chia tỷ lệ các ứng dụng Spring Batch. Những kỹ thuật này cho phép bạn -

    • Thực hiện song song các bước của một công việc.

    • Thực hiện song song một luồng đơn.

  • Reliability - Trong trường hợp không thành công, bạn có thể khởi động lại công việc từ chính xác nơi nó đã bị dừng, bằng cách tách các bước.

  • Support for multiple file formats - Spring Batch cung cấp hỗ trợ cho một số lượng lớn trình đọc và trình viết như XML, tệp phẳng, CSV, MYSQL, Hibernate, JDBC, Mongo, Neo4j, v.v.

  • Multiple ways to launch a job - Bạn có thể khởi chạy một công việc Spring Batch bằng các ứng dụng web, chương trình Java, Dòng lệnh, v.v.

Ngoài những điều này, các ứng dụng Spring Batch hỗ trợ -

  • Tự động thử lại sau khi thất bại.

  • Theo dõi trạng thái và thống kê trong quá trình thực hiện hàng loạt và sau khi hoàn thành quá trình xử lý hàng loạt.

  • Để chạy các công việc đồng thời.

  • Các dịch vụ như ghi nhật ký, quản lý tài nguyên, bỏ qua và bắt đầu lại quá trình xử lý.

Trong chương này, chúng tôi sẽ giải thích cách thiết lập môi trường Spring Batch trong Eclipse IDE. Trước khi tiến hành cài đặt, hãy đảm bảo rằng bạn đã cài đặt Eclipse trong hệ thống của mình. Nếu không, hãy tải xuống và cài đặt Eclipse trong hệ thống của bạn.

Để biết thêm thông tin về Eclipse, vui lòng tham khảo Hướng dẫn về Eclipse của chúng tôi .

Đặt Spring Batch trên Eclipse

Làm theo các bước dưới đây để thiết lập môi trường Spring Batch trên Eclipse.

Step 1 - Cài đặt Eclipse và mở một Dự án mới như thể hiện trong ảnh chụp màn hình sau.

Step 2 - Tạo một dự án Spring Batch mẫu như hình dưới đây.

Step 3- Nhấp chuột phải vào dự án và chuyển thành dự án Maven như hình bên dưới. Khi bạn chuyển đổi nó thành dự án Maven, nó sẽ cung cấp cho bạnPom.xmlnơi bạn cần đề cập đến các phụ thuộc bắt buộc. Sau đó,jar các tệp trong số đó sẽ được tự động tải xuống dự án của bạn.

Step 4 - Bây giờ, trong pom.xml của dự án, sao chép và dán nội dung sau (phần phụ thuộc cho ứng dụng hàng loạt mùa xuân) và làm mới dự án.

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

Cuối cùng, nếu bạn quan sát các phụ thuộc của Maven, bạn có thể thấy rằng tất cả các jar các tệp đã được tải xuống.

Sau đây là biểu diễn sơ đồ về kiến ​​trúc của Spring Batch. Như được mô tả trong hình, kiến ​​trúc chứa ba thành phần chính:Application, Batch CoreBatch Infrastructure.

Application - Thành phần này chứa tất cả các công việc và mã chúng ta viết bằng khung Spring Batch.

Batch Core - Thành phần này chứa tất cả các lớp API cần thiết để kiểm soát và khởi chạy một Công việc hàng loạt.

Batch Infrastructure - Thành phần này chứa trình đọc, người viết và dịch vụ được sử dụng bởi cả thành phần cốt lõi của ứng dụng và Batch.

Các thành phần của Spring Batch

Hình minh họa sau đây cho thấy các thành phần khác nhau của Spring Batch và cách chúng được kết nối với nhau.

Việc làm

Trong ứng dụng Spring Batch, một công việc là quá trình hàng loạt sẽ được thực hiện. Nó chạy từ đầu đến cuối mà không bị gián đoạn. Công việc này được chia thành nhiều bước (hoặc một công việc chứa các bước).

Chúng tôi sẽ cấu hình một công việc trong Spring Batch bằng cách sử dụng tệp XML hoặc lớp Java. Sau đây là cấu hình XML của một Công việc trong Spring Batch.

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

Một công việc hàng loạt được định cấu hình trong các thẻ <job> </job>. Nó có một thuộc tính có tênid. Trong các thẻ này, chúng tôi xác định định nghĩa và thứ tự của các bước.

Restartable - Nói chung, khi một công việc đang chạy và chúng ta cố gắng bắt đầu lại nó được coi là restartvà nó sẽ được bắt đầu lại. Để tránh điều này, bạn cần đặtrestartable có giá trị đối với false như hình bên dưới.

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

</job>

Bươc

A step là một phần độc lập của công việc chứa thông tin cần thiết để xác định và thực hiện công việc (phần của nó).

Như được chỉ định trong sơ đồ, mỗi bước bao gồm một ItemReader, ItemProcessor (tùy chọn) và một ItemWriter. A job may contain one or more steps.

Người đọc, Người viết và Người xử lý

An item reader đọc dữ liệu vào ứng dụng Spring Batch từ một nguồn cụ thể, trong khi item writer ghi dữ liệu từ ứng dụng Spring Batch tới một đích cụ thể.

An Item processorlà một lớp chứa mã xử lý xử lý dữ liệu được đọc vào lô mùa xuân. Nếu ứng dụng đọc"n" các bản ghi, sau đó mã trong bộ xử lý sẽ được thực thi trên mỗi bản ghi.

Khi không có người đọc và người viết nào được cung cấp, tasklethoạt động như một bộ xử lý cho SpringBatch. Nó chỉ xử lý một nhiệm vụ duy nhất. Ví dụ: nếu chúng ta đang viết một công việc với một bước đơn giản trong đó chúng ta đọc dữ liệu từ cơ sở dữ liệu MySQL và xử lý nó và ghi nó vào một tệp (phẳng), thì bước của chúng ta sử dụng:

  • A reader mà đọc từ cơ sở dữ liệu MySQL.

  • A writer mà ghi vào một tệp phẳng.

  • A custom processor xử lý dữ liệu theo mong muốn của chúng tôi.

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

Spring Batch cung cấp một danh sách dài các readerswriters. Sử dụng các lớp được xác định trước này, chúng ta có thể xác định các bean cho chúng. Chúng ta sẽ thảo luậnreaderswriters chi tiết hơn trong các chương tới.

JobRepository

Kho lưu trữ Công việc trong Spring Batch cung cấp các hoạt động Tạo, Truy xuất, Cập nhật và Xóa (CRUD) cho các triển khai JobLauncher, Job và Step. Chúng tôi sẽ xác định một kho công việc trong một tệp XML như hình dưới đây.

<job-repository id = "jobRepository"/>

Ngoài id, có một số tùy chọn khác (tùy chọn) có sẵn. Sau đây là cấu hình kho lưu trữ công việc với tất cả các tùy chọn và giá trị mặc định của chúng.

<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 - Trong trường hợp bạn không muốn duy trì các đối tượng miền của Spring Batch trong cơ sở dữ liệu, bạn có thể cấu hình phiên bản trong bộ nhớ của jobRepository như hình dưới đây.

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

JobLauncher

JobLauncher là một giao diện chạy lệnh Spring Batch với given set of parameters. SampleJoblauncher là lớp thực hiện JobLaunchergiao diện. Sau đây là cấu hình của JobLauncher.

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

JobInstance

A JobInstanceđại diện cho quá trình chạy hợp lý của một công việc; nó được tạo ra khi chúng ta điều hành một công việc. Mỗi cá thể công việc được phân biệt bằng tên của công việc và các tham số được truyền cho nó khi đang chạy.

Nếu thực thi JobInstance không thành công, thì có thể thực thi lại JobInstance tương tự. Do đó, mỗi JobInstance có thể có nhiều lần thực thi công việc.

JobExecution và StepExecution

JobExecution và StepExecution là đại diện của việc thực hiện một công việc / bước. Chúng chứa thông tin chạy của công việc / bước như thời gian bắt đầu (công việc / bước), thời gian kết thúc (công việc / bước).

Hầu như tất cả các ví dụ trong hướng dẫn này đều chứa các tệp sau:

  • Tệp cấu hình (tệp XML)
  • Tasklet / bộ xử lý (lớp Java)
  • Lớp Java với setters và getters (Lớp Java (bean))
  • Lớp bản đồ (lớp Java)
  • Lớp trình khởi chạy (lớp Java)

Tập tin cấu hình

Tệp cấu hình (XML) có chứa thông tin sau:

  • Các jobstep các định nghĩa.

  • Đậu xác định readerswriters.

  • Định nghĩa các thành phần như JobLauncher, JobRepository, Transaction Manager và Data Source.

Trong các ví dụ của chúng tôi, để hiểu rõ hơn, chúng tôi đã chia nó thành hai tệp job.xml tệp (xác định công việc, bước, người đọc và người viết) và context.xml tệp (trình khởi chạy công việc, kho công việc, trình quản lý giao dịch và nguồn dữ liệu).

Lớp vẽ bản đồ

Lớp Mapper, tùy thuộc vào người đọc, triển khai các giao diện như row mapper, field set mapper, v.v. Nó chứa mã để lấy dữ liệu từ trình đọc và đặt nó thành một lớp Java với settergetter phương thức (Java Bean).

Lớp đậu Java

Một lớp Java với settersgetters(Java bean) đại diện cho dữ liệu có nhiều giá trị. Nó hoạt động như một lớp trợ giúp. Chúng ta sẽ truyền dữ liệu từ một thành phần (người đọc, người viết, trình xử lý) sang thành phần khác dưới dạng đối tượng của lớp này.

Tasklet / bộ xử lý

Lớp Tasklet / processor chứa mã xử lý của ứng dụng Spring Batch. Bộ xử lý là một lớp chấp nhận một đối tượng chứa dữ liệu được đọc, xử lý nó và trả về dữ liệu đã xử lý (trong đối tượng biểu mẫu).

Lớp trình khởi chạy

Lớp này (App.java) chứa mã để khởi chạy ứng dụng Spring Batch.

Trong khi viết ứng dụng Spring Batch, chúng tôi sẽ định cấu hình công việc, bước, JobLauncher, JobRepository, Transaction Manager, trình đọc và người viết bằng các thẻ XML được cung cấp trong không gian tên Spring Batch. Do đó, bạn cần đưa không gian tên này vào tệp XML của mình như hình dưới đây.

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

Trong các phần sau, chúng ta sẽ thảo luận về các thẻ khác nhau, các thuộc tính và ví dụ của chúng, có sẵn trong không gian tên Spring Batch.

Việc làm

Thẻ này được sử dụng để xác định / cấu hình công việc của SpringBatch. Nó chứa một tập hợp các bước và nó có thể được khởi chạy bằng JobLauncher.

Thẻ này có 2 thuộc tính như được liệt kê bên dưới -

S. không Thuộc tính & Mô tả
1

Id

Nó là Id của công việc, bắt buộc phải chỉ định giá trị cho thuộc tính này.

2

restartable

Đây là thuộc tính được sử dụng để chỉ định liệu công việc có thể khởi động lại hay không. Thuộc tính này là tùy chọn.

Sau đây là cấu hình XML của công việc của SpringBatch.

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

Bươc

Thẻ này được sử dụng để xác định / cấu hình các bước của công việc SpringBatch. Nó có ba thuộc tính sau:

S. không Thuộc tính & Mô tả
1

Id

Nó là Id của công việc, bắt buộc phải chỉ định giá trị cho thuộc tính này.

2

next

Nó là phím tắt để chỉ định bước tiếp theo.

3

parent

Nó được sử dụng để chỉ định tên của bean mẹ mà từ đó cấu hình sẽ kế thừa.

Sau đây là cấu hình XML của bước SpringBatch.

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

Chunk

Thẻ này được sử dụng để xác định / cấu hình một phần của tasklet. Nó có bốn thuộc tính sau:

S. không Thuộc tính & Mô tả
1

reader

Nó đại diện cho tên của bean đọc mục. Nó chấp nhận giá trị của kiểuorg.springframework.batch.item.ItemReader.

2

writer

Nó đại diện cho tên của bean đọc mục. Nó chấp nhận giá trị của kiểuorg.springframework.batch.item.ItemWriter.

3

processor

Nó đại diện cho tên của bean đọc mục. Nó chấp nhận giá trị của kiểuorg.springframework.batch.item.ItemProcessor.

4

commit-interval

Nó được sử dụng để chỉ định số lượng mục sẽ được xử lý trước khi thực hiện giao dịch.

Sau đây là cấu hình XML của đoạn 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

Bean JobRepository được sử dụng để cấu hình JobRepository bằng cơ sở dữ liệu quan hệ. Đậu này được liên kết với loại kiểuorg.springframework.batch.core.repository.JobRepository.

S. không Thuộc tính & Mô tả
1

dataSource

Nó được sử dụng để chỉ định tên bean định nghĩa nguồn dữ liệu.

2

transactionManager

Nó được sử dụng để xác định tên của bean định nghĩa bộ quản lý giao dịch.

3

databaseType

Nó chỉ định loại cơ sở dữ liệu quan hệ được sử dụng trong kho công việc.

Sau đây là cấu hình ví dụ của 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

Đậu JobLauncher được sử dụng để cấu hình JobLauncher. Nó được liên kết với lớporg.springframework.batch.core.launch.support.SimpleJobLauncher(trong các chương trình của chúng tôi). Đậu này có một thuộc tính tên làjobrepositoryvà nó được sử dụng để chỉ định tên của bean định nghĩa jobrepository.

Sau đây là cấu hình ví dụ của jobLauncher.

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

TransactionManager

Đậu TransactionManager được sử dụng để cấu hình TransactionManager bằng cơ sở dữ liệu quan hệ. Đậu này được liên kết với loại kiểuorg.springframework.transaction.platform.TransactionManager.

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

Nguồn dữ liệu

Đậu nguồn dữ liệu được sử dụng để định cấu hình Datasource. Đậu này được liên kết với loại kiểuorg.springframework.jdbc.datasource.DriverManagerDataSource.

S. không Thuộc tính & Mô tả
1

driverClassName

Điều này chỉ định tên lớp của trình điều khiển được sử dụng để kết nối với cơ sở dữ liệu.

2

url

Điều này chỉ định URL của cơ sở dữ liệu.

3

username

Điều này chỉ định tên người dùng để kết nối với cơ sở dữ liệu.

4

password

Điều này chỉ định mật khẩu để kết nối với cơ sở dữ liệu.

Sau đây là cấu hình ví dụ của 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 đọc dữ liệu vào ứng dụng hàng loạt mùa xuân từ một nguồn cụ thể, trong khi Item Writer ghi dữ liệu từ ứng dụng Spring Batch đến một điểm đến cụ thể.

An Item processorlà một lớp chứa mã xử lý xử lý dữ liệu được đọc vào lô mùa xuân. Nếu ứng dụng đọc n bản ghi thì mã trong bộ xử lý sẽ được thực thi trên mỗi bản ghi.

A chunk là một phần tử con của tasklet. Nó được sử dụng để thực hiện các thao tác đọc, ghi và xử lý. Chúng tôi có thể cấu hình trình đọc, trình ghi và bộ xử lý bằng cách sử dụng phần tử này, trong một bước như hình dưới đây.

<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 cung cấp cho người đọc và người viết để đọc và ghi dữ liệu từ các hệ thống tệp / cơ sở dữ liệu khác nhau như MongoDB, Neo4j, MySQL, XML, flatfile, CSV, v.v.

Để bao gồm một trình đọc trong ứng dụng của bạn, bạn cần xác định một bean cho trình đọc đó, cung cấp các giá trị cho tất cả các thuộc tính bắt buộc trong bean và chuyển id của bean như một giá trị cho thuộc tính của phần tử chunk reader (giống với writer).

ItemReader

Nó là thực thể của một bước (của một quy trình hàng loạt) đọc dữ liệu. Một ItemReader đọc từng mục một. Spring Batch cung cấp một giao diệnItemReader. Tất cảreaders triển khai giao diện này.

Sau đây là một số lớp ItemReader được xác định trước do Spring Batch cung cấp để đọc từ nhiều nguồn khác nhau.

Người đọc Mục đích
FlatFIleItemReader Để đọc dữ liệu từ các tệp phẳng.
StaxEventItemReader Để đọc dữ liệu từ các tệp XML.
StoredProcedureItemReader Để đọc dữ liệu từ các thủ tục được lưu trữ của cơ sở dữ liệu.
JDBCPagingItemReader Để đọc dữ liệu từ cơ sở dữ liệu cơ sở dữ liệu quan hệ.
MongoItemReader Để đọc dữ liệu từ MongoDB.
Neo4jItemReader Để đọc dữ liệu từ Neo4jItemReader.

Chúng ta cần định cấu hình ItemReadersbằng cách tạo ra các hạt đậu. Sau đây là một ví dụ vềStaxEventItemReader mà đọc dữ liệu từ một tệp 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>

Theo quan sát, trong khi cấu hình, chúng ta cần chỉ định tên lớp tương ứng của trình đọc được yêu cầu và chúng ta cần cung cấp giá trị cho tất cả các thuộc tính được yêu cầu.

ItemWriter

Nó là yếu tố của stepcủa một quy trình hàng loạt ghi dữ liệu. Một ItemWriter viết một mục một lần. Spring Batch cung cấp một giao diệnItemWriter. Tất cả các nhà văn thực hiện giao diện này.

Sau đây là một số lớp ItemWriter được xác định trước do Spring Batch cung cấp để đọc từ nhiều nguồn khác nhau.

nhà văn Mục đích
FlatFIleItemWriter Để ghi dữ liệu vào các tệp phẳng.
StaxEventItemWriter Để ghi dữ liệu vào tệp XML.
StoredProcedureItemWriter Để ghi dữ liệu vào các thủ tục được lưu trữ của cơ sở dữ liệu.
JDBCPagingItemWriter Để ghi dữ liệu vào cơ sở dữ liệu cơ sở dữ liệu quan hệ.
MongoItemWriter Để ghi dữ liệu vào MongoDB.
Neo4jItemWriter Để ghi dữ liệu vào Neo4j.

Theo cách tương tự, chúng ta cần cấu hình ItemWriters bằng cách tạo các bean. Sau đây là một ví dụ vềJdbcCursorItemReader ghi dữ liệu vào cơ sở dữ liệu 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>

Bộ xử lý mặt hàng

ItemProcessor: Một ItemProcessor được sử dụng để xử lý dữ liệu. Khi mặt hàng đã cho không hợp lệ, nó sẽ trả lạinull, nếu không nó sẽ xử lý mục đã cho và trả về kết quả đã xử lý. Giao diệnItemProcessor<I,O> đại diện cho bộ xử lý.

Tasklet class - Khi không readerwriterđược đưa ra, một Tasklet hoạt động như một bộ xử lý cho SpringBatch. Nó chỉ xử lý một nhiệm vụ duy nhất.

Chúng tôi có thể xác định một bộ xử lý mục tùy chỉnh bằng cách triển khai giao diện ItemProcessor của gói org.springframework.batch.item.ItemProcessor. Lớp ItemProcessor này chấp nhận một đối tượng và xử lý dữ liệu và trả về dữ liệu đã xử lý như một đối tượng khác.

Trong một quy trình hàng loạt, nếu "n"các bản ghi hoặc các phần tử dữ liệu được đọc, sau đó đối với mỗi bản ghi, nó sẽ đọc dữ liệu, xử lý và ghi dữ liệu vào bộ ghi. Để xử lý dữ liệu, nó chuyển tiếp trên bộ xử lý được thông qua.

Ví dụ: giả sử bạn đã viết mã để tải một tài liệu PDF cụ thể, tạo một trang mới, ghi mục dữ liệu vào PDF ở định dạng bảng. Nếu bạn thực thi ứng dụng này, nó sẽ đọc tất cả các mục dữ liệu từ tài liệu XML, lưu trữ chúng trong cơ sở dữ liệu MySQL và in chúng trong tài liệu PDF nhất định trong các trang riêng lẻ.

Thí dụ

Sau đây là một lớp ItemProcessor mẫu.

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

Chương này cho bạn thấy ứng dụng Spring Batch cơ bản. Nó sẽ đơn giản thực hiện mộttasklet để hiển thị một thông báo.

Ứng dụng Spring Batch của chúng tôi chứa các tệp sau:

  • Configuration file- Đây là một tệp XML nơi chúng tôi xác định Công việc và các bước của công việc. (Nếu ứng dụng cũng liên quan đến người đọc và người viết, thì cấu hình củareaderswriters cũng được bao gồm trong tệp này.)

  • Context.xml - Trong tệp này, chúng tôi sẽ xác định các bean như kho công việc, trình khởi chạy công việc và trình quản lý giao dịch.

  • Tasklet class - Trong lớp này, chúng ta sẽ viết lệnh xử lý mã (Trong trường hợp này, nó hiển thị một thông báo đơn giản)

  • Launcher class - trong lớp này, chúng tôi sẽ khởi chạy Ứng dụng hàng loạt bằng cách chạy Trình khởi chạy công việc.

jobConfig.xml

Sau đây là tệp cấu hình của ứng dụng Spring Batch mẫu của chúng tôi.

<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

Sau đây là context.xml ứng dụng Spring Batch của chúng tôi.

<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

Sau đây là lớp Tasklet hiển thị một thông báo đơn giản.

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

Sau đây là mã chạy quá trình hàng loạt.

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

Khi thực thi, chương trình SpringBatch trên sẽ tạo ra kết quả sau:

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

Trong chương này, chúng ta sẽ tạo một ứng dụng Spring Batch sử dụng XML Reader và MySQL Writer.

Reader - Đầu đọc mà chúng tôi đang sử dụng trong ứng dụng là StaxEventItemReader để đọc dữ liệu từ các tài liệu XML.

Sau đây là tài liệu XML đầu vào mà chúng tôi đang sử dụng trong ứng dụng này. Tài liệu này chứa các bản ghi dữ liệu chỉ định các chi tiết như id hướng dẫn, tác giả hướng dẫn, tiêu đề hướng dẫn, ngày gửi, biểu tượng hướng dẫn và mô tả hướng dẫn.

<?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 - Sự writer chúng tôi đang sử dụng trong ứng dụng là JdbcBatchItemWriterđể ghi dữ liệu vào cơ sở dữ liệu MySQL. Giả sử chúng ta đã tạo một bảng trong MySQL bên trong cơ sở dữ liệu có tên"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 - Bộ xử lý chúng tôi đang sử dụng trong ứng dụng là bộ xử lý tùy chỉnh ghi dữ liệu của từng bản ghi trên tài liệu PDF.

Trong quá trình hàng loạt, nếu "n"bản ghi hoặc phần tử dữ liệu đã được đọc, sau đó đối với mỗi bản ghi, nó sẽ đọc dữ liệu, xử lý và ghi dữ liệu vào Writer. Để xử lý dữ liệu, nó chuyển tiếp trên bộ xử lý được thông qua. Trong trường hợp này, trong lớp bộ xử lý tùy chỉnh, chúng tôi đã viết mã để tải một tài liệu PDF cụ thể, tạo một trang mới, ghi mục dữ liệu lên PDF ở định dạng bảng.

Cuối cùng, nếu bạn thực thi ứng dụng này, nó sẽ đọc tất cả các mục dữ liệu từ tài liệu XML, lưu trữ chúng trong cơ sở dữ liệu MySQL và in chúng trong tài liệu PDF nhất định trong các trang riêng lẻ.

jobConfig.xml

Sau đây là tệp cấu hình của ứng dụng Spring Batch mẫu của chúng tôi. Trong tệp này, chúng tôi sẽ xác định Công việc và các bước. Ngoài những thứ này, chúng tôi cũng xác định các bean cho ItemReader, ItemProcessor và ItemWriter. (Ở đây, chúng tôi liên kết chúng với các lớp tương ứng và chuyển các giá trị cho các thuộc tính cần thiết để cấu hình chúng.)

<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

Sau đây là context.xmlứng dụng Spring Batch của chúng tôi. Trong tệp này, chúng tôi sẽ xác định các bean như kho công việc, trình khởi chạy công việc và trình quản lý giao dịch.

<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

Sau đây là processorlớp học. Trong lớp này, chúng ta viết mã xử lý trong ứng dụng. Tại đây, chúng tôi đang tải tài liệu PDF, tạo trang mới, tạo bảng và chèn các giá trị sau cho mỗi bản ghi: id hướng dẫn, tên hướng dẫn, tác giả, ngày gửi trong bảng.

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

Sau đây là lớp ReportFieldSetMapper đặt dữ liệu thành lớp Hướng dẫn.

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

Sau đây là Tutoriallớp học. Nó là một lớp đơn giản vớisettergetter các phương pháp.

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

Sau đây là mã chạy quá trình hàng loạt. Trong lớp này, chúng ta sẽ khởi chạy Ứng dụng hàng loạt bằng cách chạy 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()); 
   }    
}

Khi thực thi ứng dụng này, nó sẽ tạo ra kết quả sau.

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

Nếu bạn xác minh details.tutorial trong cơ sở dữ liệu, nó sẽ hiển thị cho bạn kết quả sau:

hướng dẫn _id hướng dẫn _author hướng dẫn _title ngày nộp hồ sơ hướng dẫn _icon hướng dẫn _description
1001 Sanjay Học Java 06-05-2007 https: //www.tutorials point.com / java / images / java-mini-logo.jpg Java là một ngôn ngữ lập trình cấp cao ban đầu được phát triển bởi Sun Microsystems và phát hành vào năm 1995. Java chạy trên nhiều nền tảng khác nhau. Hướng dẫn này cung cấp hiểu biết đầy đủ về Java.
1002 Abdul S Tìm hiểu MySQL 19-04-2007 https: // www. tutorialspoint.com / mysql / images /mysql-minilogo.jpg MySQL là hệ quản trị cơ sở dữ liệu SQL quan hệ nguồn mở phổ biến nhất. MySQL là một trong những RDBMS tốt nhất đang được sử dụng để phát triển các ứng dụng phần mềm dựa trên web. Hướng dẫn này sẽ giúp bạn bắt đầu nhanh với MySQL và giúp bạn thoải mái với việc lập trình MySQL.
1003 Học JavaFX Krishna Kasyap 06-07-2017 https: // www. tutorialspoint.com / javafx / images / javafx-minilogo.jpg MySQL là hệ quản trị cơ sở dữ liệu SQL quan hệ nguồn mở phổ biến nhất. MySQL là một trong những RDBMS tốt nhất đang được sử dụng để phát triển các ứng dụng phần mềm dựa trên web. Hướng dẫn này sẽ giúp bạn bắt đầu nhanh với MySQL và giúp bạn thoải mái với việc lập trình MySQL.

Thao tác này sẽ tạo một tệp PDF với các bản ghi trên mỗi trang như được hiển thị bên dưới.

Trong chương này, chúng ta sẽ tạo một ứng dụng Spring Batch đơn giản sử dụng Trình đọc CSV và Trình ghi XML.

Reader - Sự reader chúng tôi đang sử dụng trong ứng dụng là FlatFileItemReader để đọc dữ liệu từ tệp CSV.

Sau đây là tệp CSV đầu vào mà chúng tôi đang sử dụng trong ứng dụng này. Tài liệu này chứa các bản ghi dữ liệu chỉ định các chi tiết như id hướng dẫn, tác giả hướng dẫn, tiêu đề hướng dẫn, ngày gửi, biểu tượng hướng dẫn và mô tả hướng dẫn.

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 mà chúng tôi đang sử dụng trong ứng dụng là StaxEventItemWriter để ghi dữ liệu vào tệp XML.

Processor - Bộ xử lý chúng tôi đang sử dụng trong ứng dụng là bộ xử lý tùy chỉnh chỉ in các bản ghi đã đọc từ tệp CSV.

jobConfig.xml

Sau đây là tệp cấu hình của ứng dụng Spring Batch mẫu của chúng tôi. Trong tệp này, chúng tôi sẽ xác định Công việc và các bước. Ngoài những thứ này, chúng tôi cũng xác định các bean cho ItemReader, ItemProcessor và ItemWriter. (Ở đây, chúng tôi liên kết chúng với các lớp tương ứng và chuyển các giá trị cho các thuộc tính cần thiết để cấu hình chúng.)

<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

Sau đây là context.xmlứng dụng Spring Batch của chúng tôi. Trong tệp này, chúng tôi sẽ xác định các bean như kho công việc, trình khởi chạy công việc và trình quản lý giao dịch.

<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

Tiếp theo là lớp Bộ xử lý. Trong lớp này, chúng ta viết mã xử lý trong ứng dụng. Ở đây, chúng tôi đang in nội dung của từng bản ghi.

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

Sau đây là lớp TutorialFieldSetMapper đặt dữ liệu vào lớp Hướng dẫn.

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

Lớp Tutorial.java

Sau đây là Tutoriallớp học. Nó là một lớp Java đơn giản vớisettergettercác phương pháp. Trong lớp này, chúng tôi đang sử dụng các chú thích để liên kết các phương thức của lớp này với các thẻ của tệp 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

Sau đây là mã khởi chạy quy trình hàng loạt. Trong lớp này, chúng tôi sẽ khởi chạy ứng dụng hàng loạt bằng cách chạy 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()); 
   } 
}

Khi thực thi ứng dụng này, nó sẽ tạo ra kết quả sau.

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

Điều này sẽ tạo ra một tệp XML với các nội dung sau.

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

Trong chương này, chúng ta sẽ tạo một ứng dụng Spring Batch sử dụng trình đọc MySQL và trình ghi XML.

Reader - Đầu đọc mà chúng tôi đang sử dụng trong ứng dụng là JdbcCursorItemReader để đọc dữ liệu từ cơ sở dữ liệu MySQL.

Giả sử chúng ta đã tạo một bảng trong cơ sở dữ liệu MySQL như hình dưới đây:

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

Giả sử chúng tôi đã chèn các bản ghi sau vào đó.

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 mà chúng tôi đang sử dụng trong ứng dụng là StaxEventItemWriter để ghi dữ liệu vào tệp XML.

Processor - Bộ xử lý chúng tôi đang sử dụng trong ứng dụng là bộ xử lý tùy chỉnh chỉ in các bản ghi đã đọc từ tệp CSV.

jobConfig.xml

Sau đây là tệp cấu hình của ứng dụng Spring Batch mẫu của chúng tôi. Trong tệp này, chúng tôi sẽ xác định Công việc và các Bước. Ngoài những thứ này, chúng tôi cũng xác định các bean cho ItemReader, ItemProcessor và ItemWriter. (Ở đây, chúng tôi liên kết chúng với các lớp tương ứng và chuyển các giá trị cho các thuộc tính cần thiết để cấu hình chúng.)

<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

Sau đây là context.xmlứng dụng Spring Batch của chúng tôi. Trong tệp này, chúng tôi sẽ xác định các bean như kho công việc, trình khởi chạy công việc và trình quản lý giao dịch.

<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

Tiếp theo là lớp Bộ xử lý. Trong lớp này, chúng ta viết mã xử lý trong ứng dụng. Ở đây, chúng tôi đang in nội dung của từng bản ghi.

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

Sau đây là TutorialRowMapper lớp đặt dữ liệu thành Tutorial lớp học.

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

Sau đây là Tutoriallớp học. Nó là một lớp Java đơn giản vớisettergettercác phương pháp. Trong lớp này, chúng tôi đang sử dụng các chú thích để liên kết các phương thức của lớp này với các thẻ của tệp 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

Sau đây là mã chạy quá trình hàng loạt. Trong lớp này, chúng ta sẽ khởi chạy Ứng dụng hàng loạt bằng cách chạy 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()); 
   } 
}

Khi thực thi ứng dụng này, nó sẽ tạo ra kết quả sau.

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

Điều này sẽ tạo ra một tệp XML với các nội dung sau.

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

Trong chương này, chúng ta sẽ tạo một ứng dụng Spring Batch sử dụng MySQL Reader và Flatfile Người viết (.txt).

Reader - Trình đọc mà chúng tôi đang sử dụng trong ứng dụng là JdbcCursorItemReader để đọc dữ liệu từ cơ sở dữ liệu MySQL.

Giả sử chúng ta đã tạo một bảng trong cơ sở dữ liệu MySQL như hình dưới đây.

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

Giả sử chúng tôi đã chèn các bản ghi sau vào đó.

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 mà chúng tôi đang sử dụng trong ứng dụng là FlatFileItemWriter để ghi dữ liệu vào flatfile (.txt).

Processor - Bộ xử lý chúng tôi đang sử dụng trong ứng dụng là bộ xử lý tùy chỉnh chỉ in các bản ghi đã đọc từ tệp CSV.

jobConfig.xml

Sau đây là tệp cấu hình của ứng dụng Spring Batch mẫu của chúng tôi. Trong tệp này, chúng tôi sẽ xác định Công việc và các Bước. Ngoài những thứ này, chúng tôi cũng xác định các bean cho ItemReader, ItemProcessor và ItemWriter. (Ở đây, chúng tôi liên kết chúng với các lớp tương ứng và chuyển các giá trị cho các thuộc tính cần thiết để cấu hình chúng.)

<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

Sau đây là context.xmlứng dụng Spring Batch của chúng tôi. Trong tệp này, chúng tôi sẽ xác định các bean như kho công việc, trình khởi chạy công việc và trình quản lý giao dịch.

<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

Tiếp theo là lớp Bộ xử lý. Trong lớp này, chúng ta viết mã xử lý trong ứng dụng. Ở đây, chúng tôi đang in nội dung của từng bản ghi.

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

Sau đây là TutorialRowMapper lớp đặt dữ liệu thành Tutorial lớp học.

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

Sau đây là Tutoriallớp học. Nó là một lớp Java đơn giản vớisettergettercác phương pháp. Trong lớp này, chúng tôi đang sử dụng các chú thích để liên kết các phương thức của lớp này với các thẻ của tệp 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

Sau đây là mã chạy quá trình hàng loạt. Trong lớp này, chúng ta sẽ khởi chạy Ứng dụng hàng loạt bằng cách chạy 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()); 
   } 
}

Khi thực thi ứng dụng này, nó sẽ tạo ra kết quả sau.

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

Điều này sẽ tạo ra một .txt tập tin với các nội dung sau.

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]