1. 程式人生 > >通過例子講解Spring Batch入門,優秀的批處理框架

通過例子講解Spring Batch入門,優秀的批處理框架

# 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