Spring批处理如何使用ItemReadListener

时间:2014-03-25 14:15:14

标签: spring error-handling spring-batch

我使用spring批处理文件。所有组件的配置都是以编程方式进行的。

我的作业包含多个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 doc,我认为ItemReadListener是我的家伙:

public interface ItemReadListener<T> extends StepListener {

    void beforeRead();

    void afterRead(T item);

    void onReadError(Exception ex);

}

但是,我不知道如何使用它!我已经尝试过,我的seecItemReader()实现了这个接口,但是从不调用onReadError方法。

我不知道如何在tasklet中声明/注册ItemReadListener。

这里有一点春天的文档:

  

任何实现StepListener扩展之一的类(但是   不是那个界面本身,因为它是空的)可以应用于一个步骤   通过听众元素。 listeners元素在a里面是有效的   步骤,tasklet或块声明。建议您申报   其功能适用的级别的听众,或者是否适用   多功能(例如StepExecutionListener和ItemReadListener)然后   在它应用的最细粒度级别声明它(块中的块)   给出的例子)。                                                               

     

ItemReader,ItemWriter或ItemProcessor本身实现一个   将自动注册StepListener接口   如果使用命名空间元素,或者其中一个,则使用步骤   * StepFactoryBean工厂。这仅适用于直接注入Step的组件:如果侦听器嵌套在另一个组件中   组件,需要明确注册(如上所述)。

你能帮我吗?

提前致谢!

1 个答案:

答案 0 :(得分:2)

正如我猜测它比我想要的更容易,因为以编程方式注册ItemReadListener是通过tasklet配置中的listener方法:

   @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方法。