1. 程式人生 > >SpringBatch從入門到放棄003- 核心概念2

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

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