1. 程式人生 > 程式設計 >手把手教你搭建第一個Spring Batch專案的步驟

手把手教你搭建第一個Spring Batch專案的步驟

一、概述

Spring Batch是一個輕量級,全面的批處理框架。

一個典型的批處理過程可能是:

  • 從資料庫,檔案或佇列中讀取大量記錄。
  • 以某種方式處理資料。
  • 以修改之後的形式寫回資料

Spring Batch 應用架構圖:

手把手教你搭建第一個Spring Batch專案的步驟

一個Batch(批處理)過程由一個Job(作業)組成。這個實體封裝了整個批處理過程。

一個Job(作業)可以由一個或多個Step(步驟)組成。在大多數情況下,一個步驟將讀取資料(通過ItemReader),處理資料(使用ItemProcessor),然後寫入資料(通過ItemWriter)。

JobLauncher處理啟動一個Job(作業)。

最後,JobRepository儲存關於配置和執行的Job(作業)的元資料。

二、例項

1、新建 springboot專案

建立專案傳送門

選擇配置,新增依賴,GENERATE 後匯入到你的IDE

手把手教你搭建第一個Spring Batch專案的步驟

2、springboot 專案配置

2.1 在新建專案時新增依賴了,就會發現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 為資料庫連線自動配置 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;
}
//建構函式,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 建立
 @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();
 }
 //讀取資料,指定需要讀取的資源
 @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();
 }
 //處理資料
 @Bean
 public PersonItemProcessor processor() {
 return new PersonItemProcessor();
 }
 //寫入資料,指定寫入路徑檔案
 @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 處理資料

//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,greeting);
 return greeting;
 }
}

2.7 啟動專案,在 target/test-outputs/greetings.txt 檔案中找到結果。

手把手教你搭建第一個Spring Batch專案的步驟

三、理解

JobRepository

從字面上可以理解為"任務倉庫",如果把一個批處理比作一個任務的話,這個倉庫儲存了很多這種任務。JobRepository 會將任務包括其狀態等資料持久化,儲存到許多資料庫中。Spring Batch 預設會提供一個 SimpleJobRepository 倉庫,方便我們開啟批處理。

Job

“任務”。每個批處理都是一個任務,除了任務本身之外,任務也存在成功和失敗等等狀態,所以可以引出兩個概念 JobInstance 與 JobExecution 。job 是一個介面,JobInstance 是其實現,代表了“任務”本身,提供了 getJobName、getInstanceId 等方法供我們獲取任務本身的一些屬性。JobExecution 代表任務的狀態,如建立時間、結束時間、結束狀態、丟擲的異常等等。

Step

“步驟”。批處理任務肯定有非常多的步驟,如一個最基本的資料庫同步,從 A 資料庫讀取資料,存入到 B 資料庫中,這裡就分為了兩個步驟。在 Spring Batch 中,一個任務可以有很多個步驟,每個步驟大致分為三步:讀、處理、寫,其對應的類分別就是 Item Reader,Item Processor,Item Writer。

JobLauncher

“任務裝置”。如火箭發射裝置就是用來操作火箭發射的,這裡的任務裝置就是用來執行任務的。

到此這篇關於手把手教你搭建第一個Spring Batch專案的步驟的文章就介紹到這了,更多相關Spring Batch專案搭建內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!