Spring Batch - 当ItemReader没有返回数据时如何使作业失败

时间:2011-04-07 07:48:43

标签: spring spring-batch

我有一个spring批处理应用程序,它使用JdbcCursorItemReader从DB表中读取数据,并使用FlatFileItemWriter将其写入平面文件。

当我测试我的应用程序时,我发现即使没有数据通过JdbcCursorItemReader从数据库返回,FlatFileItemWriter也会创建一个文件。但是,当DB中没有适当的数据时,我打算让我的工作失败。是否可以这样做或者至少预先创建FlatFileItemWriter来创建文件?

此致

4 个答案:

答案 0 :(得分:3)

来自http://static.springsource.org/spring-batch/reference/html/patterns.html

<强> 11.7。未找到输入时处理步骤完成

在许多批处理方案中,在数据库或文件中找不到要处理的行并不例外。简单地认为步骤没有找到工作,并且读取了0个项目。 Spring Batch中提供的所有ItemReader实现都默认使用此方法。如果即使输入存在也没有写出来,这可能会导致一些混淆。 (通常在文件名称错误时发生,等等)因此,应检查元数据本身以确定框架发现处理的工作量。但是,如果没有输入被视为特殊情况怎么办?在这种情况下,以编程方式检查元数据中没有处理的项目并导致失败是最佳解决方案。因为这是一个常见的用例,所以只为侦听器提供了此功能:

public class NoWorkFoundStepExecutionListener extends StepExecutionListenerSupport {

public ExitStatus afterStep(StepExecution stepExecution) {
    if (stepExecution.getReadCount() == 0) {
        return ExitStatus.FAILED;
    }
    return null;
}

}

答案 1 :(得分:1)

  

是否可以这样做或至少阻止FlatFileItemWriter   创建文件?

对于第二部分,您的问题FlatFileItemWriter有一个flag,如果没有写任何内容,则会删除该文件。

shouldDeleteIfEmpty :标记表示如果在关闭时没有写入任何行(页眉和页脚除外),则应删除目标文件。

答案 2 :(得分:0)

即使没有数据,也会调用ItemReadListener的afterRead方法。你可以在那里放置你想要的东西。

答案 3 :(得分:0)

仅当ItemReader返回一个对象时,才会调用ItemProcessor。 空值用于表示处理已完成。

不要使用空值作为错误指示:它的目的是结束处理。 您最好为错误使用例外。