明確分離批處理的執(zhí)行環(huán)境和應(yīng)用
將通用核心的服務(wù)以接口形式提供
提供“開(kāi)箱即用” 的簡(jiǎn)單的默認(rèn)的核心執(zhí)行接口
提供Spring框架中配置、自定義、和擴(kuò)展服務(wù)
所有默認(rèn)實(shí)現(xiàn)的核心服務(wù)能夠容易的被擴(kuò)展與替換,不會(huì)影響基礎(chǔ)層
提供一個(gè)簡(jiǎn)單的部署模式,使用Maven進(jìn)行編譯
批處理關(guān)鍵領(lǐng)域模型及關(guān)鍵架構(gòu)
先來(lái)個(gè)Hello World示例,一個(gè)典型的批處理作業(yè)。

典型的一個(gè)作業(yè)分為3部分:作業(yè)讀、作業(yè)處理、作業(yè)寫(xiě),也是典型的三步式架構(gòu)。整個(gè)批處理框架基本上圍繞Read、Process、Writer來(lái)處理。除此之外,框架提供了作業(yè)調(diào)度器、作業(yè)倉(cāng)庫(kù)(用以存放Job的元數(shù)據(jù)信息,支持內(nèi)存、DB兩種模式)。
完整的領(lǐng)域概念模型參加下圖:

Job Launcher(作業(yè)調(diào)度器)是Spring Batch框架基礎(chǔ)設(shè)施層提供的運(yùn)行Job的能力。通過(guò)給定的Job名稱和作Job Parameters,可以通過(guò)Job Launcher執(zhí)行Job。
通過(guò)Job Launcher可以在Java程序中調(diào)用批處理任務(wù),也可以在通過(guò)命令行或者其它框架(如定時(shí)調(diào)度框架Quartz)中調(diào)用批處理任務(wù)。
Job Repository來(lái)存儲(chǔ)Job執(zhí)行期的元數(shù)據(jù)(這里的元數(shù)據(jù)是指Job Instance、Job Execution、Job Parameters、Step Execution、Execution Context等數(shù)據(jù)),并提供兩種默認(rèn)實(shí)現(xiàn)。
一種是存放在內(nèi)存中;另一種將元數(shù)據(jù)存放在數(shù)據(jù)庫(kù)中。通過(guò)將元數(shù)據(jù)存放在數(shù)據(jù)庫(kù)中,可以隨時(shí)監(jiān)控批處理Job的執(zhí)行狀態(tài)。Job執(zhí)行結(jié)果是成功還是失敗,并且使得在Job失敗的情況下重新啟動(dòng)Job成為可能。Step表示作業(yè)中的一個(gè)完整步驟,一個(gè)Job可以有一個(gè)或者多個(gè)Step組成。
批處理框架運(yùn)行期的模型也非常簡(jiǎn)單:

Job Instance(作業(yè)實(shí)例)是一個(gè)運(yùn)行期的概念,Job每執(zhí)行一次都會(huì)涉及到一個(gè)Job Instance。
Job Instance來(lái)源可能有兩種:一種是根據(jù)設(shè)置的Job Parameters從Job Repository(作業(yè)倉(cāng)庫(kù))中獲取一個(gè);如果根據(jù)Job Parameters從Job Repository沒(méi)有獲取Job Instance,則新創(chuàng)建一個(gè)新的Job Instance。
Job Execution表示Job執(zhí)行的句柄,一次Job的執(zhí)行可能成功也可能失敗。只有Job執(zhí)行成功后,對(duì)應(yīng)的Job Instance才會(huì)被完成。因此在Job執(zhí)行失敗的情況下,會(huì)有一個(gè)Job Instance對(duì)應(yīng)多個(gè)Job Execution的場(chǎng)景發(fā)生。
總結(jié)下批處理的典型概念模型,其設(shè)計(jì)非常精簡(jiǎn)的十個(gè)概念,完整支撐了整個(gè)框架。

Job提供的核心能力包括作業(yè)的抽象與繼承,類似面向?qū)ο笾械母拍睢?duì)于執(zhí)行異常的作業(yè),提供重啟的能力。

框架在Job層面,同樣提供了作業(yè)編排的概念,包括順序、條件、并行作業(yè)編排。

在一個(gè)Job中配置多個(gè)Step。不同的Step間可以順序執(zhí)行,也可以按照不同的條件有選擇的執(zhí)行(條件通常使用Step的退出狀態(tài)決定),通過(guò)next元素或者decision元素來(lái)定義跳轉(zhuǎn)規(guī)則;
為了提高多個(gè)Step的執(zhí)行效率,框架提供了Step并行執(zhí)行的能力(使用split進(jìn)行聲明,通常該情況下需要Step之間沒(méi)有任何的依賴關(guān)系,否則容易引起業(yè)務(wù)上的錯(cuò)誤)。Step包含了一個(gè)實(shí)際運(yùn)行的批處理任務(wù)中的所有必需的信息,其實(shí)現(xiàn)可以是非常簡(jiǎn)單的業(yè)務(wù)實(shí)現(xiàn),也可以是非常復(fù)雜的業(yè)務(wù)處理,Step的復(fù)雜程度通常是業(yè)務(wù)決定的。

每個(gè)Step由ItemReader、ItemProcessor、ItemWriter組成,當(dāng)然根據(jù)不同的業(yè)務(wù)需求,ItemProcessor可以做適當(dāng)?shù)木?jiǎn)。同時(shí)框架提供了大量的ItemReader、ItemWriter的實(shí)現(xiàn),提供了對(duì)FlatFile、XML、Json、DataBase、Message等多種數(shù)據(jù)類型的支持。