手把手教你搭建第一個Spring Batch項目的步驟
一、概述
Spring Batch是一個輕量級,全面的批處理框架。
一個典型的批處理過程可能是:
- 從數(shù)據(jù)庫,文件或隊列中讀取大量記錄。
- 以某種方式處理數(shù)據(jù)。
- 以修改之后的形式寫回數(shù)據(jù)
Spring Batch 應用架構圖:

一個Batch(批處理)過程由一個Job(作業(yè))組成。這個實體封裝了整個批處理過程。
一個Job(作業(yè))可以由一個或多個Step(步驟)組成。在大多數(shù)情況下,一個步驟將讀取數(shù)據(jù)(通過ItemReader),處理數(shù)據(jù)(使用ItemProcessor),然后寫入數(shù)據(jù)(通過ItemWriter)。
JobLauncher處理啟動一個Job(作業(yè))。
最后,JobRepository存儲關于配置和執(zhí)行的Job(作業(yè))的元數(shù)據(jù)。
二、實例
1、新建 springboot項目
選擇配置,添加依賴,GENERATE 后導入到你的IDE

2、springboot 項目配置
2.1 在新建項目時添加依賴了,就會發(fā)現(xiàn)pom中引入了 spring-barch的相關依賴,如新建項目時沒有添加依賴,則需要手動添加。
//pom.xml <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> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
2.2 為主程序的@SpringBootApplication注解添加exclude屬性,可以防止 SpringBoot 為數(shù)據(jù)庫連接自動配置 DataSource
//主程序
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class Springbatch2020829Application {
public static void main(String[] args) {
SpringApplication.run(Springbatch2020829Application.class, args);
}
}
2.3 新建實體model
//Person.java
public class Person {
private String firstName;
private String lastName;
}
//構造函數(shù),get,set方法, toString()方法略
2.4 配置 Spring Batch Job
2.4.1 新建 BatchConfig 類,重寫父類 setDataSource 方法
//BatchConfig.java
@Configuration
@EnableBatchProcessing
public class BatchConfig extends DefaultBatchConfigurer {
@Override
public void setDataSource(DataSource dataSource) {
}
}
2.4.2 新建 HelloWorldJobConfig 類,配置 job ,step
//HelloWorldJobConfig.java
@Configuration
public class HelloWorldJobConfig {
//新建 Job,Spring 將自動注入 jobBuilders ,stepBuilders兩個 beans
@Bean
public Job helloWorlJob(JobBuilderFactory jobBuilders,
StepBuilderFactory stepBuilders) {
return jobBuilders.get("helloWorldJob")
.start(helloWorldStep(stepBuilders)).build();
}
//新建 Step,使用 StepBuilderFactory 創(chuàng)建
@Bean
public Step helloWorldStep(StepBuilderFactory stepBuilders) {
return stepBuilders.get("helloWorldStep")
.<Person, String>chunk(10).reader(reader())
.processor((Function<? super Person, ? extends String>) processor()).writer(writer()).build();
}
//讀取數(shù)據(jù),指定需要讀取的資源
@Bean
public FlatFileItemReader<Person> reader() {
return new FlatFileItemReaderBuilder<Person>()
.name("personItemReader")
.resource(new ClassPathResource("csv/persons.csv"))
.delimited().names(new String[] {"firstName", "lastName"})
.targetType(Person.class).build();
}
//處理數(shù)據(jù)
@Bean
public PersonItemProcessor processor() {
return new PersonItemProcessor();
}
//寫入數(shù)據(jù),指定寫入路徑文件
@Bean
public FlatFileItemWriter<String> writer() {
return new FlatFileItemWriterBuilder<String>()
.name("greetingItemWriter")
.resource(new FileSystemResource(
"target/test-outputs/greetings.txt"))
.lineAggregator(new PassThroughLineAggregator<>()).build();
}
}
2.5 處理數(shù)據(jù)
//PersonItemProcessor.java
public class PersonItemProcessor
implements ItemProcessor<Person, String> {
private static final Logger LOGGER =
LoggerFactory.getLogger(PersonItemProcessor.class);
//打印日志信息
@Override
public String process(Person person) throws Exception {
String greeting = "Hello " + person.getFirstName() + " "
+ person.getLastName() + "!";
LOGGER.info("converting '{}' into '{}'", person, greeting);
return greeting;
}
}
2.6 測試 Spring Batch 示例
//PersonItemProcessor.java
public class PersonItemProcessor
implements ItemProcessor<Person, String> {
private static final Logger LOGGER =
LoggerFactory.getLogger(PersonItemProcessor.class);
//打印日志信息
@Override
public String process(Person person) throws Exception {
String greeting = "Hello " + person.getFirstName() + " "
+ person.getLastName() + "!";
LOGGER.info("converting '{}' into '{}'", person, greeting);
return greeting;
}
}
2.7 啟動項目,在 target/test-outputs/greetings.txt 文件中找到結果。

三、理解
JobRepository
從字面上可以理解為"任務倉庫",如果把一個批處理比作一個任務的話,這個倉庫存儲了很多這種任務。JobRepository 會將任務包括其狀態(tài)等數(shù)據(jù)持久化,存儲到許多數(shù)據(jù)庫中。Spring Batch 默認會提供一個 SimpleJobRepository 倉庫,方便我們開啟批處理。
Job
“任務”。每個批處理都是一個任務,除了任務本身之外,任務也存在成功和失敗等等狀態(tài),所以可以引出兩個概念 JobInstance 與 JobExecution 。job 是一個接口,JobInstance 是其實現(xiàn),代表了“任務”本身,提供了 getJobName、getInstanceId 等方法供我們獲取任務本身的一些屬性。JobExecution 代表任務的狀態(tài),如創(chuàng)建時間、結束時間、結束狀態(tài)、拋出的異常等等。
Step
“步驟”。批處理任務肯定有非常多的步驟,如一個最基本的數(shù)據(jù)庫同步,從 A 數(shù)據(jù)庫讀取數(shù)據(jù),存入到 B 數(shù)據(jù)庫中,這里就分為了兩個步驟。在 Spring Batch 中,一個任務可以有很多個步驟,每個步驟大致分為三步:讀、處理、寫,其對應的類分別就是 Item Reader,Item Processor,Item Writer。
JobLauncher
“任務裝置”。如火箭發(fā)射裝置就是用來操作火箭發(fā)射的,這里的任務裝置就是用來執(zhí)行任務的。
到此這篇關于手把手教你搭建第一個Spring Batch項目的步驟的文章就介紹到這了,更多相關Spring Batch項目搭建內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring Native實現(xiàn)0.059s啟動一個SpringBoot項目
Spring Native是Spring框架的一個子項目,旨在提供一種將Spring應用程序編譯為本地可執(zhí)行文件的方法,從而提高啟動時間和資源效率,本文主要介紹了Spring Native實現(xiàn)0.059s啟動一個SpringBoot項目,感興趣的可以了解一下2024-02-02
springBoot?之spring.factories擴展機制示例解析
這篇文章主要為大家介紹了springBoot?之spring.factories擴展機制示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04

