【问题标题】:Spring Batch - how to fail a job when the ItemReader returns no dataSpring Batch - 当ItemReader没有返回数据时如何使作业失败
【发布时间】:2011-04-07 07:48:43
【问题描述】:

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

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

问候

【问题讨论】:

    标签: spring spring-batch


    【解决方案1】:

    来自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;
    }
    
    }
    

    【讨论】:

    • Spring Batch 中开箱即用的所有 ItemReader 实现都默认采用这种方法,我使用的是JdbcPagingItemReader,如果阅读器没有,它会将作业标记为失败有任何行开头。我错过了什么吗?
    • 我还按照您的回答中的描述添加了侦听器并在步骤中注册,但作业仍被标记为失败。对于我的场景,没有行是有效的情况。
    • @SabirKhan 我不这么认为,我使用的是 JdbcCursorItemReader 并且当没有数据要读取时我没有得到任何异常。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        ItemProcessor 只有在 ItemReader 返回一个对象时才会被调用。 空值用于表示处理完成。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-20
          • 2015-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-01
          相关资源
          最近更新 更多