2014-03-25 85 views
3

我使用spring批處理文件。所有組件的配置都是以編程方式進行的。Spring批處理如何使用ItemReadListener

我有一個包含幾個TaskletSteps工作:

@Bean 
    @Named(SEEC_JOB) 
    public Job seecJob() { 
     return jobBuilderFactory.get(SEEC_JOB).start(seecMoveToWorkingStep()).next(seecLoadFileStep()) 
       .on(ExitStatus.COMPLETED.getExitCode()).to(seecFlowMoveToArchiveOk()).from(seecLoadFileStep()) 
       .on(ExitStatus.FAILED.getExitCode()).to(seecFlowMoveToArchiveKo()).end().build(); 

    } 

我的問題集中在seecLoadFileStep(),波紋管的細節:

@Bean 
    public TaskletStep seecLoadFileStep() { 
     TaskletStep build = stepBuilderFactory.get(SEEC_LOAD_FILE_STEP) 
       .<SeecMove, SeecMove>chunk(cormoranProperties.seec.batchSize.get()).reader(seecItemReader()) 
       .writer(seecItemWriter()).build(); 
     return build; 
    } 

我想拋出一個特定的異常,如果閱讀錯誤歪曲(通過閱讀錯誤我的意思是:該文件是例如損壞或它是錯誤的,缺席xml標記...)。

我一直在閱讀Spring Batch的文檔,我覺得ItemReadListener是我的傢伙:

public interface ItemReadListener<T> extends StepListener { 

    void beforeRead(); 

    void afterRead(T item); 

    void onReadError(Exception ex); 

} 

,但是,我不知道如何使用它!我試過做我的seecItemReader()實現這個接口,但onReadError方法永遠不會被調用。

我不知道如何聲明/註冊taskletStep ItemReadListener。

在這裏有點彈簧文檔的:

實現StepListener的延伸部中的一個(但 不是接口本身,因爲它是空的)的任何類可以通過偵聽元件被應用到步驟 。 listeners元素在 步驟,小程序或塊聲明中有效。建議您在其功能適用的級別聲明 ,或者如果它是 多功能(例如StepExecutionListener和ItemReadListener),則 將聲明它應用的最細化級別(在給定示例的 示例中聲明它) )。

一種ItemReader,ItemWriter或ItemProcessor中其本身實現StepListener接口之一 將自動與 如果使用名字空間元素,或所述 * StepFactoryBean工廠之一註冊的步驟。這僅適用於直接注入Step的組件:如果偵聽器嵌套在另一個 組件中,則需要顯式註冊它(如上所述)。

你能幫我嗎?

在此先感謝!

+1

http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/core/step/builder/SimpleStepBuilder.html#listener(org.springframework.batch.core.ItemWriteListener)? –

回答

2

正如我猜測這是比較容易比我吼聲,用於編程登記ItemReadListener是通過偵聽方法在微進程配置:

@Bean 
    public TaskletStep seecLoadFileStep() { 
     TaskletStep build = stepBuilderFactory.get(SEEC_LOAD_FILE_STEP) 
       .<SeecMove, SeecMove>chunk(cormoranProperties.seec.batchSize.get()).reader(seecItemReader()).listener(seecItemReaderListener()) 
       .writer(seecItemWriter()).build(); 
     return build; 
    } 

現在當一個異常發生時,onError方法被調用。