SpringBatch從入門到放棄003- 核心概念2

  • 2019 年 11 月 1 日
  • 筆記

1. Job

Job是一個封裝了 Batch 整個執行過程的實體,和其他 Spring 工程一樣,Job可以基於 XML 和 Java-based配置兩種,但是無論使用怎樣的配置,Job都在這個結構的頂層。結構層次如下:

在 Spring Batch 中,Job是 Step的一個容器,一個 Job 根據一定的邏輯聚合了一個或多個 Step,使 Step 按照一定的規則執行,同時 Job還可以定義在所有 Step 之上的屬性,如Job是否可以重啟。Job 具體的屬性包括一下幾類:

  • Job 的名稱,作為 Job 的唯一標識
  • Job 內 Step 的執行順序
  • Job 是否支援重啟

下邊是一個基於 Java-based 配置的 Job 定義:

@Bean  public Job footballJob() {    return this.jobBuilderFactory.get("footballJob")    .start(playerLoad())    .next(gameLoad())    .next(playerSummarization())    .end()    .build();  }  

1.1 JobInstance

一個 Job 的執行會生成一個 Job Instance,但是並不是每一次 Job 執行都會生成一個 Job Instance。在 Launch一個 Job 的時候,如果根據 Job 名稱和運行參數判斷當前 Job Repository中已經存在一個 Job Instance ,就會繼續執行已經存在的,如果不存在則會新啟一個Job Instance。所以 Job Instance 可以理解為:
Job Instance = Job Name + Job Parameters

1.2 JobParameters

Job Parameters 是運行時 Job 需要傳入的參數,會存儲在 Job 運行的上下文中:

如上圖中這個例子,EndOfDay 時一個 Job,運行的時候會生成一個 Job Instance,這個 Instance 接受一個日期類型的參數 D1(Job Parameters),那這個 Instance 就會被唯一標記為D1的 EndOfDay 。

Spring Batch 框架允許有不用來標記一個 Job Instance 的參數。

1.3 JobExecution

Job 的每一次運行,不管成功還是失敗都會產生一條 JobExecution 記錄,這個記錄包括狀態,開始時間,結束時間,推出原因,運行參數等整個運行期間的所有資訊。一個 Job Instance 如果運行成功會對應一個 Job Executions,如果運行失敗會對應多條 Job Execution。

這裡我們先來了解一下概念。具體Job Execution 的表我們會在後續章節中介紹,

2. Step

Step 是批處理的一個最小的執行事務,這個執行事務可以是一個實現Tasklet介面的實現類,也可以是標準的 reader/processor/writer 結構。一個 job 包含至少一個 Step ,多個 Step 可以有一定的邏輯順序。同樣的每個 Step 執行對應一個或多個 Step Execution。執行成功對應的一條記錄,執行失敗,對應多條記錄。Step Executioon 同樣會記錄運行期的全部數據。

3. ExecutionContext

Execution Context 用來記錄 Job Execution 和 Step Execution 狀態的鍵值對集合,主要是用來方便的進行現場的恢復,比如在 ItemReader 執行前,記錄當前的狀態,當 ItemReader執行期間遇到異常推出,或者母體程式異常關閉,更或者機房斷電等意外發生時,我們可以保存執行的前的狀態,根據這個狀態,重新開始。
所以 Execution Context 包括 JobExecutionContext 和 StepExecutionContext 兩部分,分別對應各自的表,表結構我們在後續章節介紹。

4. 配置一個 Job

如果基於Java-based 配置一個 Job,我們一般通過JobBuilderFactory get到一個 JobBuilder

@Bean  public Job footballJob() {    return this.jobBuilderFactory.get("footballJob")    .start(playerLoad())    .next(gameLoad())    .next(playerSummarization())    .end()    .build();  }  

然後根據傳入的參數會得到一個 SimpleJobBuilder 或者 JobFlowBuilder :

在 SimpleJobBuilder 中我們可以看到有下列屬性可以設置:

在 JobFlowBuilder 中則可以設置如下屬性:

5. 運行一個 Job

對於非 web 應用程式,框架提供了 CommandLineJobRunner 用於 launch 一個 batch 的運行:

<bash$ java CommandLineJobRunner io.spring.EndOfDayJobConfiguration endOfDay
schedule.date(date)=2007/05/05

這種方式每次運行都會生成一個新的 JobLaunch。
對於 Web 應用程式,我們只需要注入一個 JobLaunch 即可,在程式碼中注入一個 JobLaunch,可以直接調用 jobLaunch.run 方法,執行一個 Job。

運行程式碼如下:

@Controller  public class JobLauncherController {    @Autowired    JobLauncher jobLauncher;    @Autowired    Job job;    @RequestMapping("/jobLauncher.html")    public void handle() throws Exception{    jobLauncher.run(job, new JobParameters());    }  }  

在 Web 程式中,因為 Spring Bean 的單例特性,所以所有的啟動是一同一個 JobLaunch。

截止到目前所有的 Batch 領域概念都已經介紹完了,後邊我們將進入實例階段,介紹真正執行邏輯的 Reader/Processor/Writer。