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 Corevà Batch 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 readers và writers. 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ậnreaders và writers 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 job và step các định nghĩa.
Đậu xác định readers và writers.
Đị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 setter và getter phương thức (Java Bean).
Lớp đậu Java
Một lớp Java với setters và getters(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 reader và writerđượ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ủareaders và writers 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ớisetter và getter 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ớisetter và gettercá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ớisetter và gettercá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ớisetter và gettercá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]