Spring Batch 之 背景框架簡介
Spring Batch 是一個輕量級的、全面的批處理框架,用於開發對企業系統的日常操作至關重要的健壯批處理應用程式。Spring Batch提供了處理大量記錄所必需的可重用功能,包括日誌/跟蹤、事務管理、作業處理統計資訊、 作業重啟、跳過和資源管理。它還提供了更高階的技術服務和特性,這些特性將通過優化和分割槽技術支援極高容量和高效能的批處理作業。無論簡單還是複雜,大容量批處理作業都可以以高度可伸縮的方式利用框架來處理大量資訊。
Features(特性)
- Transaction management 事務管理
- Chunk based processing 基於塊的處理
- Declarative I/O 宣告式I / O
- Start/Stop/Restart 啟動/停止/啟動
- Retry/Skip 重試/跳過
- Web based administration interface (Spring Cloud Data Flow) 基於Web的管理介面(Spring Cloud Data Flow)
Spring batch主要有以下部分組成:
- JobRepository 用來註冊job的容器
- JobLauncher 用來啟動Job的介面
- Job 實際執行的任務,包含一個或多個Step
- Step step包含ItemReader、ItemProcessor和ItemWriter
- ItemReader 用來讀取資料的介面
- ItemProcessor 用來處理資料的介面
- ItemWriter 用來輸出資料的介面
一個Job有一個或多個Step組成,Step有讀、處理、寫三部分操作組成;通過JobLauncher啟動Job,啟動時從
JobRepository獲取Job Execution;
當前執行的Job及Step的結果及狀態儲存在JobRepository中。
下面是Springboot整合Spring Batch 的 一個HelloSpringBatch Demo :
pom 檔案,引入配置:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>compile</scope>
</dependency>
<!--<dependency>-->
<!--<groupId>com.h2database</groupId>-->
<!--<artifactId>h2</artifactId>-->
<!--</dependency>-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.10</version>
</dependency>
</dependencies>
spring batch JobConfig:
配置一個job,和所屬的step;此處demo,使用虛擬碼寫入,輸出,再後續部落格中,將更新,基於資料庫,檔案等輸入、輸出。
package com.batch.demo.helloSpringBatch;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableBatchProcessing
public class JobConfiguration {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job helloWorldJob(){
return jobBuilderFactory.get("helloWorldJob")
.start(step1())
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("Hello Spring Batch");
return RepeatStatus.FINISHED;
}
}).build();
}
}
application.properties:
#配置spring batch job instance 等資訊存放資料來源
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test
spring.datasource.username=root
spring.datasource.password=123
#初始化spring batch job、step等資訊存放的表,demo使用mysql
#spring.datasource.schema=classpath:/org/springframework/batch/core/schema-mysql.sql
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
#spring.batch.initialize-schema=always
#是否啟動專案時候,自動執行job
#spring.batch.job.enabled = false
執行後,控制檯輸出:
2018-12-30 15:47:45.696 INFO 8896 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=helloWorldJob]] launched with the following parameters: [{}]
2018-12-30 15:47:45.753 INFO 8896 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step1]
Hello Spring Batch
2018-12-30 15:47:45.950 INFO 8896 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=helloWorldJob]] completed with the following parameters: [{}] and the following status: [COMPLETED]
在資料庫中,可以檢視到job的具體資訊:
到這裡,一個簡單的 hello world job 就已經執行完畢了。
本文主要是介紹下spring bacth的背景和架構組織,後續部落格將逐步針對JobLauncher 、Job、Step、ItemReader、ItemProcessor 、ItemWriter 基於檔案、資料庫等儲存進行批處理。
補充:
spring batch 的資訊配置表建立,是根據datesource去讀取,匹配執行相對應的sql進行create table。具體執行指令碼在spring-batch-core下:classpath:/org/springframework/batch/core/schema-***.sql。