2011-04-07 34 views
1

我有一个Spring批处理应用程序,它使用JdbcCursorItemReader从数据库表中读取数据,并使用FlatFileItemWriter将其写入平面文件。Spring批处理 - 如何在ItemReader不返回数据时失败作业

当我测试我的应用程序时,我发现即使没有数据通过JdbcCursorItemReader从数据库返回,FlatFileItemWriter也会创建一个文件。但是,如果数据库中没有适当的数据,我打算失​​败。是否有可能这样做,或至少prevenet创建一个文件的FlatFileItemWriter?即使没有数据

问候

回答

0

ItemReadListener的afterRead方法将被调用。你可以把你想要的东西放在那里。

0

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

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

+0

感谢来自OCTO – Fabinout 2016-03-14 14:14:24

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

} 
+0

**所有在Spring Batch中提供的ItemReader实现默认为这种方法**,我正在使用'JdbcPagingItemReader'并且它将作业标记为失败,如果阅读器没有任何行开始。我错过了什么吗? – 2016-08-29 10:32:56

+0

我还添加了听众所描述的答案和步骤注册,但作业仍然标记为失败。对于我的场景,没有行是有效的情况。 – 2016-08-29 10:39:33

0

是否有可能这样做,或至少防止FlatFileItemWriter从 创建一个文件?

对于第二部分的问题FlatFileItemWriter你有一个flag删除该文件,如果什么也没写。

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

相关问题