我使用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的组件:如果侦听器嵌套在另一个组件中 组件,需要明确注册(如上所述)。
你能帮我吗?
提前致谢!
答案 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方法。