通過例子講解Spring Batch入門,優秀的批處理框架
阿新 • • 發佈:2020-09-13
# 1 前言
> 歡迎訪問[南瓜慢說 www.pkslow.com](https://www.pkslow.com/)獲取更多精彩文章!
`Spring相關文章:`[Springboot-Cloud相關](https://www.pkslow.com/categories/springboot)
`Spring Batch`是一個輕量級的、完善的批處理框架,作為`Spring`體系中的一員,它擁有靈活、方便、生產可用的特點。在應對高效處理大量資訊、定時處理大量資料等場景十分簡便。
結合排程框架能更大地發揮`Spring Batch`的作用。
# 2 Spring Batch的概念知識
## 2.1 分層架構
`Spring Batch`的分層架構圖如下:
![](https://img2020.cnblogs.com/other/946674/202009/946674-20200913103733333-774659614.png)
可以看到它分為三層,分別是:
- `Application`應用層:包含了所有任務`batch jobs`和開發人員自定義的程式碼,主要是根據專案需要開發的業務流程等。
- `Batch Core`核心層:包含啟動和管理任務的執行環境類,如`JobLauncher`等。
- `Batch Infrastructure`基礎層:上面兩層是建立在基礎層之上的,包含基礎的`讀入reader`和`寫出writer`、重試框架等。
## 2.2 關鍵概念
理解下圖所涉及的概念至關重要,不然很難進行後續開發和問題分析。
![](https://img2020.cnblogs.com/other/946674/202009/946674-20200913103733642-1051295443.png)
### 2.2.1 JobRepository
專門負責與資料庫打交道,對整個批處理的新增、更新、執行進行記錄。所以`Spring Batch`是需要依賴資料庫來管理的。
### 2.2.2 任務啟動器JobLauncher
負責啟動任務`Job`。
### 2.2.3 任務Job
`Job`是封裝整個批處理過程的單位,跑一個批處理任務,就是跑一個`Job`所定義的內容。
![](https://img2020.cnblogs.com/other/946674/202009/946674-20200913103733879-1246140567.png)
上圖介紹了`Job`的一些相關概念:
- `Job`:封裝處理實體,定義過程邏輯。
- `JobInstance`:`Job`的執行例項,不同的例項,引數不同,所以定義好一個`Job`後可以通過不同引數執行多次。
- `JobParameters`:與`JobInstance`相關聯的引數。
- `JobExecution`:代表`Job`的一次實際執行,可能成功、可能失敗。
所以,開發人員要做的事情,就是定義`Job`。
### 2.2.4 步驟Step
`Step`是對`Job`某個過程的封裝,一個`Job`可以包含一個或多個`Step`,一步步的`Step`按特定邏輯執行,才代表`Job`執行完成。
![](https://img2020.cnblogs.com/other/946674/202009/946674-20200913103734592-1338199991.png)
通過定義`Step`來組裝`Job`可以更靈活地實現複雜的業務邏輯。
### 2.2.5 輸入——處理——輸出
所以,定義一個`Job`關鍵是定義好一個或多個`Step`,然後把它們組裝好即可。而定義`Step`有多種方法,但有一種常用的模型就是`輸入——處理——輸出`,即`Item Reader`、`Item Processor`和`Item Writer`。比如通過`Item Reader`從檔案輸入資料,然後通過`Item Processor`進行業務處理和資料轉換,最後通過`Item Writer`寫到資料庫中去。
`Spring Batch`為我們提供了許多開箱即用的`Reader`和`Writer`,非常方便。
# 3 程式碼例項
理解了基本概念後,就直接通過程式碼來感受一下吧。整個專案的功能是從多個`csv`檔案中讀資料,處理後輸出到一個`csv`檔案。
## 3.1 基本框架
新增依賴:
```xml
```
需要新增`Spring Batch`的依賴,同時使用`H2`作為記憶體資料庫比較方便,實際生產肯定是要使用外部的資料庫,如`Oracle`、`PostgreSQL`。
入口主類:
```java
@SpringBootApplication
@EnableBatchProcessing
public class PkslowBatchJobMain {
public static void main(String[] args) {
SpringApplication.run(PkslowBatchJobMain.class, args);
}
}
```
也很簡單,只是在`Springboot`的基礎上添加註解`@EnableBatchProcessing`。
領域實體類`Employee`:
```java
package com.pkslow.batch.entity;
public class Employee {
String id;
String firstName;
String lastName;
}
```
對應的`csv`檔案內容如下:
```bash
id,firstName,lastName
1,Lokesh,Gupta
2,Amit,Mishra
3,Pankaj,Kumar
4,David,Miller
```
## 3.2 輸入——處理——輸出
### 3.2.1 讀取ItemReader
因為有多個輸入檔案,所以定義如下:
```java
@Value("input/inputData*.csv")
private Resource[] inputResources;
@Bean
public MultiResourceItemReader