1.1、什么是批處理
在現(xiàn)代企業(yè)應(yīng)用中叁鉴,面對復(fù)雜的業(yè)務(wù)以及海量的數(shù)據(jù),除了通過龐雜的人機(jī)交互界面進(jìn)行各種批處理外佛寿,還有一類工作幌墓,不需要人工干預(yù),只需要定期讀入大批量數(shù)據(jù)冀泻,然后完成相應(yīng)業(yè)務(wù)并進(jìn)行歸檔克锣。這類工作稱為批處理。
從上面的描述可以看出腔长,批處理應(yīng)用有如下幾個特點(diǎn):
· 數(shù)據(jù)量大袭祟,少則百萬,多則上億的數(shù)量級捞附。
· 不需要人工干預(yù)巾乳,由系統(tǒng)根據(jù)配置自動完成。
· 與時間相關(guān)鸟召,如每天執(zhí)行一次或每月執(zhí)行一次胆绊。
同時,批處理應(yīng)用又明顯分為三個環(huán)節(jié):
· 讀數(shù)據(jù)欧募,數(shù)據(jù)可能來自文件压状、數(shù)據(jù)庫或消息隊(duì)列等。
· 數(shù)據(jù)處理,如電信支撐系統(tǒng)的計(jì)費(fèi)處理种冬。
· 寫數(shù)據(jù)镣丑,將輸出結(jié)果寫入文件、數(shù)據(jù)庫或消息隊(duì)列等娱两。
下面是一個典型的批處理應(yīng)用場景:系統(tǒng)A從數(shù)據(jù)庫中獲取數(shù)據(jù)莺匠,經(jīng)過業(yè)務(wù)處理后,導(dǎo)出系統(tǒng)B需要的數(shù)據(jù)到文件中十兢,系統(tǒng)B讀取該文件趣竣,經(jīng)過業(yè)務(wù)處理后,最后存放到數(shù)據(jù)庫中旱物。
1.2遥缕、Spring Batch
Spring Batch 作為 Spring 的子項(xiàng)目,是一款基于 Spring 的企業(yè)批處理框架宵呛。通過它可以構(gòu)建出健壯的企業(yè)批處理應(yīng)用单匣。Spring Batch 不僅提供了統(tǒng)一的讀寫接口、豐富的任務(wù)處理方式烤蜕、靈活的事務(wù)管理及并發(fā)處理封孙,同時還支持日志迹冤、監(jiān)控讽营、任務(wù)重啟與跳過等特性,大大簡化了批處理應(yīng)用開發(fā)泡徙,將開發(fā)人員從復(fù)雜的任務(wù)配置管理過程中解放出來橱鹏,使他們可以更多地去關(guān)注核心的業(yè)務(wù)處理過程。
另外我們還需要知道堪藐,Spring Batch 是一款批處理應(yīng)用框架莉兰,不是調(diào)度框架。它只關(guān)注批處理任務(wù)相關(guān)的問題礁竞,如事務(wù)糖荒、并發(fā)、監(jiān)控模捂、執(zhí)行等捶朵,并不提供相應(yīng)的調(diào)度功能。因此狂男,如果我們希望批處理任務(wù)定期執(zhí)行综看,可結(jié)合 Quartz 等成熟的調(diào)度框架實(shí)現(xiàn)。
1.2.1 Spring Batch架構(gòu)
Spring Batch核心架構(gòu)分為三層:應(yīng)用層岖食,核心層红碑,基礎(chǔ)結(jié)構(gòu)層:
應(yīng)用層包含所有的批處理作業(yè),通過Spring框架管理程序員自定義的代碼泡垃。核心層包含Spring Batch啟動和控制所需要的核心類析珊,如:JobLauncher羡鸥、Job和step等。應(yīng)用層和核心層建立在基礎(chǔ)架構(gòu)層之上唾琼,基礎(chǔ)架構(gòu)層提供通用的讀(ItemReader)兄春、寫(ItemWriter)和服務(wù)處理。
Spring Batch的三層體系架構(gòu)使得Spring Batch框架在不同的層級進(jìn)行擴(kuò)展锡溯,避免不同層級間的影響赶舆。
1.3 Spring Batch 2.0新特性
· 支持java5;
· 非順序的Step支持祭饭;
· 面向Chunk處理芜茵;
· 強(qiáng)化元數(shù)據(jù)訪問;
· 增強(qiáng)擴(kuò)展性倡蝙;
· 可配置九串;
1.3.1 支持非順序的Step
Spring Batch 2.0支持條件判斷執(zhí)行Step的方式。在2.0版本之前寺鸥,僅支持順序執(zhí)行Step:
下面代碼中展示了如何配置條件Step:
1.3.2 面向Chunk處理
Spring Batch 1.X版本對數(shù)據(jù)處理默認(rèn)提供的策略是面向Item處理:
在面向Item處理中猪钮,ItemReader會返回一個對象(即Item)給ItemWriter進(jìn)行處理,Item的數(shù)據(jù)為提交間隔的要求時提交計(jì)算結(jié)果胆建。例如烤低,如果提交所要求得Item數(shù)量為3時,ItemReader和ItemWriter分別會被調(diào)用3次:
對應(yīng)的ItemReader和ItemWriter為了實(shí)現(xiàn)回滾的場景笆载,需要在內(nèi)部定義復(fù)雜的方法(如mark標(biāo)記方法扑馁,reset恢復(fù)方法,clear清除方法等)凉驻。接口ItemReader和ItemWriter在Spring Batch 1.X版本的實(shí)現(xiàn)代碼為:
由于處理的范圍是一個Item腻要,如果要支持回滾場景就需要額外的方法,此時mark涝登,reset雄家,flush,和clear就派上了用場胀滚。如趟济,在成功讀/寫了2個item之后,在寫第三個item時發(fā)生了錯誤蛛淋,整個事物就需要回滾咙好,writer中的clear方法會被調(diào)用,用于清空緩存褐荷,ItemReader中的reset被調(diào)用勾效,用于把mark方法所指向的數(shù)據(jù)游標(biāo)復(fù)原。
Spring Batch 2.0中支持面向Chunk的操作,簡化了ItemReader和ItemWriter接口的復(fù)雜度层宫。面向Chunk的操作序列圖如下:
按照面向Chunk的操作杨伙,如果提交間隔是3次,那么讀操作被調(diào)用3次萌腿,寫操作被調(diào)用1次限匣。讀Item被匯總到列表中,最終被統(tǒng)一寫出:
面向Chunk的方案不僅更加簡單更有擴(kuò)展性毁菱,同時也讓ItemReader和ItemWriter接口更加簡潔米死。接口ItemReader和ItemWriter在Spring Batch 2.X版本的實(shí)現(xiàn)參見代碼:
如代碼所示,ItemReader和ItemWriter接口不再包含mark贮庞,reset峦筒,flush,和clear方法窗慎,使得讀和寫對象的創(chuàng)建更加直接物喷。ItemReader例子中,接口非常簡單遮斥,框架會為開發(fā)者把讀取的item緩存起來峦失,以防止rollback情況的放生。ItemWriter也很簡單术吗,不再是一次一個item的拿取尉辑,而是一次把整個item塊都拿到,把控制權(quán)交給step前決定資源的寫入藐翎。
1.3.3 增加ItemProcessor
在Spring Batch 2.0 之前材蹬,Step只依賴ItemReader和ItemWriter实幕,在SpringBatch 2.0 中引入了ItemProcessor(負(fù)責(zé)業(yè)務(wù)數(shù)據(jù)的處理)吝镣。
通常的業(yè)務(wù)場景需要在數(shù)據(jù)寫入之前,對數(shù)據(jù)進(jìn)行處理昆庇,在Spring Batch 1.X版本中末贾,可以使用組合模式,通過在讀/寫之間加入ItemTransformer這一層來實(shí)現(xiàn):
Spring Batch 2.0 版本之后的Step整吆,將ItemTransformer重新命名為ItemProcessor拱撵,和ItemReader與ItemWriter提升為相同的層級:
1.4 開發(fā)環(huán)境搭建
下載RELEASE 2.2.1版本(http://static.springsource.org/downloads/nightly/release-download.php?project=BATCH)(BATCH/spring-batch-2.2.1.RELEASE-no-dependencies.zip)。
下載后直接解壓:
· dist:編譯好的jar和源文件壓縮包表蝙;
· samples:示例工程拴测,需要maven構(gòu)建項(xiàng)目;
因此為了編譯samples項(xiàng)目府蛇,需要安裝Maven集索。
【參考】
[1] 《Spring Batch 批處理框架》