此系列博客皆為學習Spring Batch時的一些筆記;
為什么我們需要批處理?
- 我們不會總是想要立即得到需要的信息,批處理允許我們在請求處理之前就一個既定的流程開始搜集信息;比如說一個銀行對賬單,我們可以按月生成,並在用戶查詢之前開啟一個批處理流程進行處理;
- 有時候它能讓生意做得更好;比如說在線購物時,並不是說你買了一個產品零售商就立即發貨,而是四五個小時后,統一發貨;
- 更好的利用資源;讓應該利用的處理能力閑置起來是一個大的浪費,我們可以定制處理讓一個機器一個接一個的運行Job可以更好的利用機器的處理能力;
什么是批處理?
批處理是指在沒有與用戶進行交互和干擾的情況下進行數據處理,一旦開始,一個批處理流程應該在沒有任何干擾的情況下運行至結束;
為什么要使用Spring Batch?
- 可維護性,Spring Batch能讓你依靠Spring框架所提倡的依賴注入去解耦對象,憑借Spring所提供的測試工具生成健壯的一系列測試單元,這些都讓你的維護風險最小化;
- 靈活性,使用Spring Batch,你能在系統之間共享代碼,如你能使用那些在你的Web應用程序中已經被測試和調試過的服務;
- 可擴展性,在一個完全沒有事務管理的Batch Job中,你只需要記住一些原則,並通過一些簡單的配置就可以讓整個批處理流程具有事務回滾和Commit的能力;
- 學習曲線低,如果你有過使用Spring的經驗,你只需很小的學習曲線就能使用Spring Batch,因為Spring Batch建立在Spring框架的基礎之上,它遵循Spring的慣例,像其他基於Spring的應用程序那樣,使用Spring的其它特征;
- 活躍的社區支持;
Spring Batch的背景及組成
Spring Batch框架是埃森哲和SpringSource合作項目,它利用一個基於標准的方式去實現常見的批處理模式和范例;它實現的特征包括:數據驗證、輸出格式化、用一種可重用的方式去實現復雜的業務規則、處理大數據集的能力;
Spring Batch由3層組成:
第一層是應用程序層,包括:所有的自定義代碼、為建立批處理流程的所有配置、業務邏輯和服務;注意應用程序層並不處於其它兩層的上方,而是封裝了其它兩層(核心層和基礎框架層),原因是在應用程序層中絕大多數你所開發的自定義代碼都是和核心層一起工作的;
應用程序層絕大部分時候是和下一層(核心層)進行交互,核心層包含了定義“批處理域”的所有部分,核心組件的元素包括Job和Step接口,同時也包括執行Job的所有接口:JobLauncher和JobParameter;
最下面一層是基礎框架層,為了做一些處理,你需要從文件、數據庫中讀寫數據,或者應付一個Job失敗的情況,這些部分被視作為常見的基礎框架,被放置在Framework的基礎框架組件里面。
注意:Spring Batch最常見的誤解是它是一個scheduler,但在Spring Batch中沒有任何一種方式能讓一個Job在某個預定的時間或者被某個事件觸發時啟動,這些都是通過外部的方式來做到
使用Spring Batch來定義Job
Spring Batch包含了很多領域特定的概念,其間就包括Job,一個Job是指由很多Step組成的一個流程,當一個Step失敗之后,這個Job可能會重新運行也可能不會重新運行,一個Job的流程也可能基於某個條件來運行;我們可以在一個applicationContext文件中這樣來定義一個Job:
<bean id="accountTasklet" class="com.thoughtworks.springBatchDemo.AccountTasklet"/> <job id="accountJob"> <step id="accountStep"> <tasklet ref="accountTasklet"/> </step> </job>
Spring Batch Admin Project
Spring Batch提供了很多管理工具,例如啟動或停止Spring Batch Job、查看上次Job運行情況的統計信息;Spring Batch將這些功能都包含在一個新的插件里:Spring Batch Admin Project,它提供了一個基於Web的控制中心,讓你能對你的批處理流程實施控制,並能監控批處理的性能。