每一個(gè)行業(yè)都有自己的行話,SpringBatch也不例外。
Job
一個(gè)Job是用于封裝一整個(gè)批處理的實(shí)體。和其它Spring項(xiàng)目一樣,一個(gè)Job和一個(gè)XML配置文件相連。這個(gè)文件可能叫任務(wù)配置。無(wú)論如何,Job是整個(gè)層次結(jié)構(gòu)的頂點(diǎn)。
一個(gè)Job就是一系列Step的容器。Job可以定義一些屬性,如是否可以重新執(zhí)行。Step會(huì)使用Job定義的屬性。
Job的定義包含下面幾個(gè)部分
• 一個(gè)簡(jiǎn)單的名字
• 一系列步驟
• 是否支持重新執(zhí)行
SpringBatch提供一個(gè)基本的實(shí)現(xiàn)SimpleJob??梢杂孟旅娣绞脚渲靡粋€(gè)Job
- <job id="footballJob">
- <step id="playerload" next="gameLoad"/>
- <step id="gameLoad" next="playerSummarization"/>
- <step id="playerSummarization"/>
- </job>
<job id="footballJob">
<step id="playerload" next="gameLoad"/>
<step id="gameLoad" next="playerSummarization"/>
<step id="playerSummarization"/>
</job>
JobInstance
一個(gè)JobInstance就是一個(gè)Job的實(shí)例。一個(gè)Job的每次受調(diào)度都會(huì)產(chǎn)生一個(gè)JobInstance。假如我們配置一個(gè)每天都運(yùn)行的任務(wù)。那么每天都會(huì)有一個(gè)JobInstance產(chǎn)生。1月1號(hào)會(huì)有一個(gè)JobInstance,1月2號(hào)會(huì)有一個(gè)。如果1月1號(hào)的那個(gè)JobInstance執(zhí)行失敗,再執(zhí)行一次并不會(huì)新產(chǎn)生一個(gè)JobInstance,還是1月1號(hào)的那個(gè)JobInstance。
一個(gè)JobInstance不和任何數(shù)據(jù)綁定。JobInstance只保存狀態(tài),如何加載數(shù)據(jù)完全由ItemReader的實(shí)現(xiàn)決定。
JobParameters
JobParameters用于區(qū)分JobInstance。一個(gè)JobParameters是在開(kāi)始一個(gè)Job時(shí)的一組參數(shù)。
在上圖的例子中,有兩個(gè)JobInstance,1月1號(hào)和1月2號(hào)。但是它們屬于同一個(gè)Job,所以我們可以說(shuō)JobInstance = Job + JobParameters。
JobExecution
一個(gè)JobExecution就是一次真正意義上一次Job的執(zhí)行。一個(gè)JobInsntace可以有多個(gè)JobExecution,一個(gè)JobExecution的失敗并不意味這個(gè)JobInstance失敗。
一個(gè)Job定義這個(gè)Job該如何執(zhí)行。JobInstnace用于將一系列的JobExecution組織起來(lái)。JobExecution會(huì)將本次執(zhí)行的狀態(tài)記錄下來(lái)。
JobExecution有如下屬性:
- status:本次執(zhí)行的狀態(tài),可以是BatchStatus.STARTED、BatchStatus.FAILED、BatchStatus.COMPLETED等
- startTime:JobExecution執(zhí)行開(kāi)始時(shí)間
- endTime:JobExecution執(zhí)行的結(jié)束時(shí)間
- exitStatus:JobExecution執(zhí)行的結(jié)果
- createTime:JobExecution的生成時(shí)間。如果還沒(méi)有開(kāi)始執(zhí)行那么就沒(méi)有startTime,但是createTime始終是有的。
- executionContext:一個(gè)容器,用于執(zhí)行時(shí)需要保存的用戶數(shù)據(jù)。
- failureExceptions:執(zhí)行時(shí)碰到的異常列表。有多個(gè)異常的導(dǎo)致失敗時(shí)會(huì)有用。
Step
每個(gè)Job包含一個(gè)或多個(gè)Step。一個(gè)Step包含實(shí)際執(zhí)行需要的信息。一個(gè)Step可以很簡(jiǎn)單也業(yè)很復(fù)雜。一個(gè)簡(jiǎn)單的Step可能不需要代碼或只要寫(xiě)一點(diǎn)點(diǎn)代碼,如把數(shù)據(jù)從文件加載到數(shù)據(jù)庫(kù)中。和Job一樣,一個(gè)Step也有StepExecution的概念。如下圖所示,Job由Step組成,JobExecution由StepExecution組成。
StepExecution
StepExecution表示一個(gè)Step的執(zhí)行。 StepExecution只有在真正開(kāi)始時(shí)才會(huì)生成,而不是JobExecution開(kāi)始時(shí)就生成所有的StepExecution。StepExecution有對(duì)應(yīng)的Step(可能只是名字?)和JobExecution的引用,以及和事務(wù)相關(guān)的數(shù)據(jù)。它還有一個(gè)ExecutionContext,用于保存用戶數(shù)據(jù)。
StepExecution有下面的一系列屬性。
- status:本次執(zhí)行的狀態(tài),可以是BatchStatus.STARTED、BatchStatus.FAILED、BatchStatus.COMPLETED等
- startTime:JobExecution執(zhí)行開(kāi)始時(shí)間
- endTime:JobExecution執(zhí)行的結(jié)束時(shí)間
- exitStatus:JobExecution執(zhí)行的結(jié)果
- createTime:JobExecution的生成時(shí)間。如果還沒(méi)有開(kāi)始執(zhí)行那么就沒(méi)有startTime,但是createTime始終是有的。
- executionContext:一個(gè)容器,用于執(zhí)行時(shí)需要保存的用戶數(shù)據(jù)。
- failureExceptions:執(zhí)行時(shí)碰到的異常列表。有多個(gè)異常的導(dǎo)致失敗時(shí)會(huì)有用。
- readCount:有少條記錄已經(jīng)成功的讀了。
- writeCount:有少條記錄已經(jīng)成功的寫(xiě)了。
- commitCount:已經(jīng)提交了多少次事務(wù)了。
- rollbackCount:和Step相關(guān)的事物被回滾了多少次。
- readSkipCount:讀跳過(guò)了多少次。resulting in a skipped item.?
- processSkipCount:處理跳過(guò)了多少次。resulting in a skipped item.
- filterCount:用ItemProcessor跳過(guò)了多少條記錄。
- writeSkipCount:寫(xiě)跳過(guò)了多少次。resulting in a skipped item.?
ExecutionContext
ExecutionContext是一系列的鍵/值對(duì),由框架控制保存。它允許用戶保存StepExecution或JobExecution的狀態(tài)信息。ExecutionContext和Quartz的JobDataMap非常類似。使用ExecutionContext的最佳例子就是重試的輔助。以讀取文本文件為例,處理時(shí)可以將處理到哪一行記錄到ExecutionContext中,框架會(huì)把這些信息在檢入點(diǎn)永久保持起來(lái)。當(dāng)失敗時(shí)可以從上次失敗的那個(gè)點(diǎn)開(kāi)始重新運(yùn)行。
JobRepository
JobRepository是上面所有東西的存儲(chǔ)機(jī)制。它為JobLauncher、Job和Step的實(shí)現(xiàn)提供了CRUD操作。當(dāng)一個(gè)Job開(kāi)始運(yùn)行時(shí),從JobRepository獲取一個(gè)JobExecution。在執(zhí)行階段StepExecution和JobExecution會(huì)保存到JobRepository中。
JobLauncher
JobLauncher用于從JobRepository獲取JobExecution和執(zhí)行該JobExecution。接口定義如下。
- public interface JobLauncher {
- public JobExecution run(Job job, JobParameters jobParameters)
- throws JobExecutionAlreadyRunningException, JobRestartException;
- }
- }
public interface JobLauncher {
public JobExecution run(Job job, JobParameters jobParameters)
throws JobExecutionAlreadyRunningException, JobRestartException;
}
}
ItemReader
ItemReader用于抽象Step的輸入。當(dāng)所有輸入讀完后返回null。
ItemWriter
ItemWriter用于抽象Step的輸出,每次一條記錄。通常來(lái)說(shuō),ItemWriter并不知道下一條要處理什么,它只有當(dāng)前的那條記錄。
ItemProcessor
ItemProcessor用于抽象一條記錄的處理。ItemReader用于讀一條記錄,ItemWriter用于寫(xiě)一條記錄,ItemProcessor用于應(yīng)用業(yè)務(wù)邏輯,從一種格式到另一種格式。在處理過(guò)程中,返回null表示這條記錄不需要寫(xiě)下來(lái)。