來(lái)源: 北大青鳥(niǎo) 2015年08月04日 15:08
Spring Batch 2. 行話 每一個(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定義的屬性。 ? 一個(gè)簡(jiǎn)單的名字 ? 一系列步驟 ? 是否支持重新執(zhí)行 SpringBatch提供一個(gè)基本的實(shí)現(xiàn)SimpleJob??梢杂孟旅娣绞脚渲靡粋€(gè)Job Xml代碼
<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有如下屬性:
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有下面的一系列屬性。
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。接口定義如下。 Java代碼
public interface JobLauncher { public JobExecution run(Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException, JobRestartException; }}ItemReaderItemReader用于抽象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)。 |