1. 程式人生 > >資料共享-spring batch(9)上下文處理

資料共享-spring batch(9)上下文處理

[TOC] > 在 Spring Batch 中進行資料及引數傳遞的方法。 ## 1 引言 本文是 Spring Batch 系列文章的第9篇,有興趣的可見文章: - [資料批處理神器-Spring Batch(1)簡介及使用場景](https://mp.weixin.qq.com/s/mH0kmprpnvk-rvKrYQPF1Q) - [快速瞭解元件-spring batch(2)之helloworld](https://mp.weixin.qq.com/s/kCzt2puSE8gdUL49MROrIA) - [快速使用元件-spring batch(3)讀檔案資料到資料庫](https://mp.weixin.qq.com/s/z2pHjXhMKqxDu-r9PWuOKg) - [決戰資料庫-spring batch(4)資料庫到資料庫](https://mp.weixin.qq.com/s/zA2W_GRKpE7R41VDk05C0g) - [便捷的資料讀寫-spring batch(5)結合beetlSql進行資料讀寫](https://mp.weixin.qq.com/s/BKIhNdyRnOFzkF5eHTCxGA) - [增量同步-spring batch(6)動態引數繫結與增量同步](https://mp.weixin.qq.com/s/yrpZkBWuHNPibzKvS2g8Jg) - [排程與監控-spring batch(7)結合xxl-job進行批處理](https://mp.weixin.qq.com/s/Poe8EZxCJgWbd5RkIzU0Eg) - [mongo同步-spring batch(8)的mongo讀寫元件使用](https://mp.weixin.qq.com/s/HvUbCdHeUIwqRX4PNPLebg) 前面文章以例項的方式對 Spring Batch 進行批處理進行詳細說明,相信大家對字串、檔案,關係型資料庫及 NoSQL 資料庫的讀取,處理,寫入流程已比較熟悉。有小夥伴就問,針對這個任務流程,期間有多個步驟,從任務( Job )啟動,到作業步( Step )的執行,其中又包含讀元件、處理元件、寫元件,那麼,針對這個流程,若中間需要傳遞自定義的資料,該如何處理?本文將對 Spring Batch 進行資料傳遞的方法進行描述,依然會使用程式碼例項的方式進行講解。包括以下幾個內容: - 基於 Mybatis-plus 整合多資料來源的資料庫訪問 - 使用 ExecutionContext 共享資料 - StepScope 動態繫結引數傳遞 ## 2 開發環境 - JDK環境: jdk1.8 - Spring Boot: 2.1.4.RELEASE - Spring Batch:4.1.2.RELEASE - 開發IDE: IDEA - 構建工具Maven: 3.3.9 - 日誌元件logback:1.2.3 - lombok:1.18.6 - MySQL: 5.6.26 - Mybatis-plus: 3.4.0 本示例原始碼已放至[github](https://github.com/mianshenglee/spring-batch-example/tree/master/spring-batch-param):`https://github.com/mianshenglee/spring-batch-example/tree/master/spring-batch-param`,請結合示例程式碼進行閱讀。 ## 3 基於 Mybatis-plus 整合多資料來源的資料庫訪問 本示例還是使用原來示例功能,從源資料庫讀取使用者資料,處理資料,然後寫入到目標資料庫。其中會在任務啟動時傳遞引數,並在作業步中傳遞引數。之前已經介紹過如何使用 beetlsql 進行多資料來源配置([便捷的資料讀寫-spring batch(5)結合beetlSql進行資料讀寫][5]),實現資料批處理。還有很多朋友使用 Mybatis 或 Mybatis-plus 進行資料庫讀寫,因此,有必要提一下 Spring Batch 如何結合 Mybatis 或 Mybatis-plus 配置多資料來源操作。本示例以 Mybatis-plus 為例。 示例工程中的`sql`目錄有相應的資料庫指令碼,其中源資料庫`mytest.sql`指令碼建立一個`test_user`表,並有相應的測試資料。目標資料庫 `my_test1.sql` 與 `mytest.sql`表結構一致,`spring-batch-mysql.sql`是 Spring Batch 本身提供的資料庫指令碼。 ### 3.1 pom 檔案中引入 Mybatis-plus ```xml ``` ### 3.2 配置及使用多資料來源 本示例會涉及三個資料庫,分別是 Spring Batch 本身資料庫,需要批處理的源資料庫,批處理的目標資料庫。因此需要處理多個數據庫,利用多套源策略,可以很簡單就完成多套資料來源的處理。簡單來說主要分為以下幾個步驟: - 配置多資料來源連線資訊 - 根據不同資料來源劃分`mapper` 包,`entity`包,`mapper.xml`檔案包 - 根據不同資料來源配置獨立的` SqlSessionFactory ` - 根據不同的應用場景,使用不同的 `mapper` 關於多資料來源多套源策略的詳細配置過程,可以參考我的另一篇文章《[搞定SpringBoot多資料來源(1):多套源策略](https://mp.weixin.qq.com/s/0J-FLYScYtEMnj0vZToX7g)》 ## 4 ExecutionContext 傳遞引數 關於 Spring Batch 的讀資料( ItemReader )、處理資料( ItemProcessor )、寫資料( ItemWriter )的配置流程,可以參考前面系列文章,本文不再詳細描述。我們需要記住的是,當一個作業( Job )啟動,Spring Batch 是通過作業名稱( Job name)及 作業引數( JobParameters )作為唯一標識來區分不同的作業。一個 Job 下可以有多個作業步( Step ),每個 Step 中就是有具體的操作邏輯(讀、處理、寫)。在 Job 和 Step 下的各個操作步驟間,如何傳遞,,這裡就需要理解 ExecutionContext 的概念。 ### 4.1 ExecutionContext 概念 在 Job 的執行及 Step 的執行過程中,Spring Batch 提供 ExecutionContext 進行執行資料持久化,利用它,可以根據業務進行資料共享,如用來重啟的靜態資料與狀態資料。如下圖: ![Spring Batch 引數傳遞](https://gitee.com/mianshenglee/datastorage/raw/master/md-photo/springbatch/springbatch-9/spring%20batch-%E5%8F%82%E6%95%B0%E4%BC%A0%E9%80%92.png) Execution Context 本質上來講就是一