我有一个 spring 批处理应用程序,它使用 JdbcCursorItemReader 从 DB 表中读取数据,并使用 FlatFileItemWriter 将其写入平面文件。
当我测试我的应用程序时,我看到 FlatFileItemWriter 会创建一个文件,即使没有通过 JdbcCursorItemReader 从数据库返回数据。但是,当数据库中没有适当的数据时,我打算让我的工作失败。是否可以这样做或至少阻止 FlatFileItemWriter 创建文件?
问候
我有一个 spring 批处理应用程序,它使用 JdbcCursorItemReader 从 DB 表中读取数据,并使用 FlatFileItemWriter 将其写入平面文件。
当我测试我的应用程序时,我看到 FlatFileItemWriter 会创建一个文件,即使没有通过 JdbcCursorItemReader 从数据库返回数据。但是,当数据库中没有适当的数据时,我打算让我的工作失败。是否可以这样做或至少阻止 FlatFileItemWriter 创建文件?
问候
来自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;
}
}
是否可以这样做或至少阻止 FlatFileItemWriter 创建文件?
对于第二部分,您的问题FlatFileItemWriter有一个标志,如果没有写入任何内容,则删除该文件。
shouldDeleteIfEmpty:标志表示如果在关闭时没有写入任何行(除了页眉和页脚),则应删除目标文件。
仅当 ItemReader 返回一个对象时才会调用 ItemProcessor。空值用于指示处理完成。
不要使用空值作为错误指示:它的目的是结束处理。您最好对错误使用异常。
即使没有数据,也会调用 ItemReadListener 的 afterRead 方法。你可能可以把你想要的东西放在那里。