spring batch初識


Spring Batch是什么? 

      Spring Batch是一個基於Spring的企業級批處理框架,按照我師父的說法,所有基於Spring的框架都是使用了spring的IoC特性,然后加上自己的一些處理規則。因此,要理解Spring Batch的設計和使用,首先需要理解批處理的機制和特點。 
      所謂企業批處理就是指在企業級應用中,不需要人工干預,定期讀取數據,進行相應的業務處理之后,再進行歸檔的這類操作。從上面的描述中可以看出,批處理的整個流程可以明顯的分為3個階段: 
         1、讀數據 
         2、業務處理 
         3、歸檔結果數據 
另外,從定義中可以發現批處理的一個重要特色就是無需人工干預、定期執行,因此一個批處理框架,需要關注事務的粒度,日志監控,執行方式,資源管理,讀數據,處理數據,寫數據的解耦等方面。 
      SpringBatch為我們提供了什么呢? 
       1、統一的讀寫接口 
       2、豐富的任務處理方式、 
       3、靈活的事務管理及並發處理 
       4、日志、監控、任務重啟與跳過等特性 
注意,Spring Batch未提供關於批處理任務調度的功能,因此如何周期性的調用批處理任務需要自己想辦法解決,就Java來說,Quartz是一個不錯的解決方案,或者寫腳本處理之。

 

Batch框架整體初見

這種分層結構有三個重要的組成部分:應用層、核心層、基礎架構層。應用層包含所有的批處理作業,通過Spring框架管理程序員自定義的代碼。核心層包含了Batch啟動和控制所需要的核心類,如:JobLauncher、Job和step等。應用層和核心層建立在基礎構架層之上,基礎構架層提供共通的讀(ItemReader)、寫(ItemWriter)、和服務(如RetryTemplate:重試模塊。可以被應用層和核心層使用)。所以使用spring-batch需引入spring-batch-core.jar和spring-batch-infrastructure.jar(建議2.1.8.RELEASE).

 

Spring Batch執行流程

         Batch執行流程:外部控制器調用JobLauncher啟動一個Job,Job調用自己的Step去實現對數據的操作,Step處理完成后,再將處理結果一步步返回給上一層。其中Job里會配置一次批次處理數量commin-interval,read讀一條傳給process一條重復這2個操作直到commin-interval最大值就調用一次writer操作。然后再重復上次操作直到處理完所有的數據。當這個Step的工作完成以后,或是跳到其他Step,或是結束處理。

 

類圖介紹

 

關鍵類介紹

JobLauncher:接口JobLauncher只有一個子類SimpleJobLauncher.負責整個batch的啟動,是入口類。使用run(Jobjob, JobParameters jobParameters)方法,該方法根據JobParameters運行job,其作用就是綁定一組JobParameters到Job上,然后運行該Job。

 

Job:接口Job有個抽象子類AbstractJob擴展了Job功能的屬性,下在有很多子類,其中SimpleJob是我們常用的子類,一個job包含若干step。配置批處理任務的領域對象,該對象的作用,第一是做Step的容器,配置該批處理任務需要的Step,以及他們之間的邏輯關系。第二是配置該批處理任務的特征,比方說名字,是否可重啟,是否對JobParameters進行驗證以及驗證規則等。spring batch3.0支持JobScope后,它可以確保一個執行中的job只有一個bean實例,同事我們可以隨時為對象注入當前job的上下文實例信息,只要我們設置bean的scope為“job",就可以說使用JobParameters和JobExecutionContext等信息。

<bean id="flatFileItemReader" scope="job" class="org.springframework.batch.item.file.FlatFileItemReader">
    <property name="resource" value="#{jobParameters['input.file.name']}" />
</bean>

 在代碼中使用如下:

public class a{

@Value("#{jobParameters[transDate]}")

private String transDate;

}

Step: 接口Step有個抽象子類AbstractStep擴展了Step功能的屬性,下面有很多子類,其中TaskletStep是我們常用的子類,一個Step包含一個Tasklet實例,負責具體的事件。這種形式非常自由,開發人員只需要實現Tasklet接口,它有一個方法RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception,返回的是RepeatStatus枚舉類,有三種狀態:CONTINUABLE和FINISHED,假如是FINISHED,則表示step已經結束,進行下一個step。假如是CONTINUABLE,則表示未完成,不停的循環,直到完成這個step,相當於死循環,不會進行到下一個step,這個狀態要小心,也可以直接跑異常,不同執行下面的step,使該job失敗,結束job。其中的邏輯完全有自己決定。另一種是Chunk-Oriented形式的,這種形式定義了一個Step的流程必須是“讀-處理(可選)-寫”。每一個Step只能由一個Tasklet或者一個Chunk構成。在Spring Batch中,更方便的方式是通過JobParameter傳入。為了實現該功能,Spring Batch通過自定義scope來達到Job和Step屬性的后期綁定(Late Binding)。這是SpringBatch的一個后綁定技術,就是在生成Step的時候,才去創建bean,因為這個時候jobparameter才傳過來。如果加載配置信息的時候就創建bean,這個時候jobparameter的值還沒有產生,會拋出異常,即拋出初始化bean異常,所有一定要這么設置,其他普通bean就默認設置就行了,只有batch里面的writer,reader,processor等需要配置scope

<bean id="flatFileItemReader" scope="step" class="org.springframework.batch.item.file.FlatFileItemReader">
    <property name="resource" value="#{jobParameters['input.file.name']}" />
</bean>

 

JobRepository:它會為Spring Batch的運維數據提供一種持久化機制。其為所有的運維數據的提供CRUD的操作接口,並為所有的操作提供事務支持,是存儲job及step的倉庫。只有一個子類SimpleJobRepository.它有兩種存儲方式:第一個是通過數據庫保存信息,第二個是集合存儲。所以當我們使用第一種保存里數據庫里要創建對應的表,而對應的表在Jar里有提供sql

 

而JobRepositoryFactoryBean和MapJobRepositoryFactoryBean都是JobRepository工廠類,JobReository需要注入到jobLauncher,job和step里

<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
  <property name="jobRepository" ref="jobRepository"/>
  <property name="taskExecutor" ref="batchThreadPoolExecutor"/>
</bean>
<task:executor id="
batchThreadPoolExecutor" keep-alive="5" thread-pool="50"/>

 job重新啟動也是通過JobRepository來實現。

 

但是,假如批量job執行狀態status為completed或者abandoned,而且還有參數,則不能重新啟程,需要修改參數,或者重置參數為空,空跑批量job。

 

ItemReader:提供了讀取數據的能力,是數據來源,是單行讀取數據,有文件讀取方式(FlatFileItemReader,必需配置resource和lineMapper兩個屬性,其它可選配),和數據庫讀取方式(AbstractPagingItemReader,必需配置參數queryId,sqlMapCLient, dataSource,其它選配)

 

 

ItemProcessor:我們可以通過它處理自定義的業務邏輯,完成轉換、過濾等操作。數據來自reader的數據,也是單行處理。當處理到size=1000(可以自定義)的時候,批量給writer寫操作

ItemWriter:提供了寫數據的能力,批量化處理。

batch監聽器,通過監聽器,可以監聽job,step,reader,processor,writer所有的狀態數據,以備以后找錯使用

 

注意:

1,jobName不能重復

2,批量name和定時任務name不能重復

3,批量傳參的時候key值不能重復,不然會被覆蓋

4,定時任務的實例跟批量的實例不能相同,即不能有相同的id,包括bean中的id


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM