框架還為Step提供了重啟、事務(wù)、重啟次數(shù)、并發(fā)數(shù);以及提交間隔、異常跳過(guò)、重試、完成策略等能力?;赟tep的靈活配置,可以完成常見(jiàn)的業(yè)務(wù)功能需求。其中三步走(Read、Processor、Writer)是批處理中的經(jīng)典抽象。

作為面向批的處理,在Step層提供了多次讀、處理,一次提交的能力。
在Chunk的操作中,可以通過(guò)屬性commit-interval設(shè)置read多少條記錄后進(jìn)行一次提交。通過(guò)設(shè)置commit-interval的間隔值,減少提交頻次,降低資源使用率。Step的每一次提交作為一個(gè)完整的事務(wù)存在。默認(rèn)采用Spring提供的聲明式事務(wù)管理模式,事務(wù)編排非常方便。如下是一個(gè)聲明事務(wù)的示例:

框架對(duì)于事務(wù)的支持能力包括:
Chunk支持事務(wù)管理,通過(guò)commit-interval設(shè)置每次提交的記錄數(shù);
支持對(duì)每個(gè)Tasklet設(shè)置細(xì)粒度的事務(wù)配置:隔離界別、傳播行為、超時(shí);
支持rollback和no rollback,通過(guò)skippable-exception-classes和no-rollback-exception-classes進(jìn)行支撐;
支持JMS Queue的事務(wù)級(jí)別配置;
另外,在框架資深的模型抽象方面,Spring Batch也做了極為精簡(jiǎn)的抽象。

僅僅使用六張業(yè)務(wù)表存儲(chǔ)了所有的元數(shù)據(jù)信息(包括Job、Step的實(shí)例,上下文,執(zhí)行器信息,為后續(xù)的監(jiān)控、重啟、重試、狀態(tài)恢復(fù)等提供了可能)。
BATCH_JOB_INSTANCE:作業(yè)實(shí)例表,用于存放Job的實(shí)例信息
BATCH_JOB_EXECUTION_PARAMS:作業(yè)參數(shù)表,用于存放每個(gè)Job執(zhí)行時(shí)候的參數(shù)信息,該參數(shù)實(shí)際對(duì)應(yīng)Job實(shí)例的。
BATCH_JOB_EXECUTION:作業(yè)執(zhí)行器表,用于存放當(dāng)前作業(yè)的執(zhí)行信息,比如創(chuàng)建時(shí)間,執(zhí)行開始時(shí)間,執(zhí)行結(jié)束時(shí)間,執(zhí)行的那個(gè)Job實(shí)例,執(zhí)行狀態(tài)等。
BATCH_JOB_EXECUTION_CONTEXT:作業(yè)執(zhí)行上下文表,用于存放作業(yè)執(zhí)行器上下文的信息。
BATCH_STEP_EXECUTION:作業(yè)步執(zhí)行器表,用于存放每個(gè)Step執(zhí)行器的信息,比如作業(yè)步開始執(zhí)行時(shí)間,執(zhí)行完成時(shí)間,執(zhí)行狀態(tài),讀寫次數(shù),跳過(guò)次數(shù)等信息。
BATCH_STEP_EXECUTION_CONTEXT:作業(yè)步執(zhí)行上下文表,用于存放每個(gè)作業(yè)步上下文的信息。
實(shí)現(xiàn)作業(yè)的健壯性與擴(kuò)展性
批處理要求Job必須有較強(qiáng)的健壯性,通常Job是批量處理數(shù)據(jù)、無(wú)人值守的,這要求在Job執(zhí)行期間能夠應(yīng)對(duì)各種發(fā)生的異常、錯(cuò)誤,并對(duì)Job執(zhí)行進(jìn)行有效的跟蹤。
一個(gè)健壯的Job通常需要具備如下的幾個(gè)特性:
1. 容錯(cuò)性
在Job執(zhí)行期間非致命的異常,Job執(zhí)行框架應(yīng)能夠進(jìn)行有效的容錯(cuò)處理,而不是讓整個(gè)Job執(zhí)行失敗;通常只有致命的、導(dǎo)致業(yè)務(wù)不正確的異常才可以終止Job的執(zhí)行。
2. 可追蹤性
Job執(zhí)行期間任何發(fā)生錯(cuò)誤的地方都需要進(jìn)行有效的記錄,方便后期對(duì)錯(cuò)誤點(diǎn)進(jìn)行有效的處理。例如在Job執(zhí)行期間任何被忽略處理的記錄行需要被有效的記錄下來(lái),應(yīng)用程序維護(hù)人員可以針對(duì)被忽略的記錄后續(xù)做有效的處理。
3. 可重啟性
Job執(zhí)行期間如果因?yàn)楫惓?dǎo)致失敗,應(yīng)該能夠在失敗的點(diǎn)重新啟動(dòng)Job;而不是從頭開始重新執(zhí)行Job。

框架提供了支持上面所有能力的特性,包括Skip(跳過(guò)記錄處理)、Retry(重試給定的操作)、Restart(從錯(cuò)誤點(diǎn)開始重新啟動(dòng)失敗的Job):
Skip,在對(duì)數(shù)據(jù)處理期間,如果數(shù)據(jù)的某幾條的格式不能滿足要求,可以通過(guò)Skip跳過(guò)該行記錄的處理,讓Processor能夠順利的處理其余的記錄行。
Retry,將給定的操作進(jìn)行多次重試,在某些情況下操作因?yàn)槎虝旱漠惓?dǎo)致執(zhí)行失敗,如網(wǎng)絡(luò)連接異常、并發(fā)處理異常等,可以通過(guò)重試的方式避免單次的失敗,下次執(zhí)行操作時(shí)候網(wǎng)絡(luò)恢復(fù)正常,不再有并發(fā)的異常,這樣通過(guò)重試的能力可以有效的避免這類短暫的異常。
Restart,在Job執(zhí)行失敗后,可以通過(guò)重啟功能來(lái)繼續(xù)完成Job的執(zhí)行。在重啟時(shí)候,批處理框架允許在上次執(zhí)行失敗的點(diǎn)重新啟動(dòng)Job,而不是從頭開始執(zhí)行,這樣可以大幅提高Job執(zhí)行的效率。