學(xué)AI,好工作 就找北大青鳥(niǎo)
關(guān)注小青 聽(tīng)課做題,輕松學(xué)習(xí)
周一至周日
4000-9696-28

Spring Batch 2. 行話

來(lái)源: 北大青鳥(niǎo) 2015年08月04日 15:08

摘要: Spring Batch 2. 行話
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定義的屬性。


Spring Batch 2. 行話

Job的定義包含下面幾個(gè)部分
? 一個(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>  


<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始終是有的。

  • lastUpdated:最后更新時(shí)間

  • 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.?

ExecutionContextExecutionContext是一系列的鍵/值對(duì),由框架控制保存。它允許用戶保存StepExecution或JobExecution的狀態(tài)信息。ExecutionContext和Quartz的JobDataMap非常類(lèi)似。使用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。接口定義如下。
Java代碼 

  • 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;    }}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)。


熱門(mén)班型時(shí)間
人工智能就業(yè)班 即將爆滿
AI應(yīng)用線上班 即將爆滿
UI設(shè)計(jì)全能班 即將爆滿
數(shù)據(jù)分析綜合班 即將爆滿
軟件開(kāi)發(fā)全能班 爆滿開(kāi)班
網(wǎng)絡(luò)安全運(yùn)營(yíng)班 爆滿開(kāi)班
報(bào)名優(yōu)惠
免費(fèi)試聽(tīng)
課程資料
官方微信
返回頂部
培訓(xùn)課程 熱門(mén)話題 站內(nèi)鏈接