如何在Spring-Batch中使用ItemReader跳过行?

mem*_*und 1 java spring spring-batch

我有一个自定义项目阅读器,可将行从文本文件转换为我的实体:

public class EntityItemReader extends AbstractItemStreamItemReader<MyEntity> {
    @Override
    public MyEntity read() {
       String line = delegate.read();
       //analyze line and skip by condition
       //line.split
       //create entity with line values
    }
}
Run Code Online (Sandbox Code Playgroud)

这类似于FlatFileItemReader

然后,读取的内容MyEntity将由保留到数据库JdbcItemReader

问题:有时我的行包含应跳过的值。

但是,当我只是return nullread()阅读器的方法内部时,不仅会跳过此项目,而且会完全终止阅读,并且将跳过所有其他行。因为null元素是所有弹簧读取器的“信号”,所以要读取的文件已完成。

因此:如果无法返回null,我该怎么做才能按条件跳过阅读器中的特定行?因为根据读者的本性,我被迫在此处返回一个对象。

Jul*_*n R 5

我认为过滤某些行的好习惯是不使用阅读器,而是使用处理器(当您要过滤行时可以返回null)。

请参阅http://docs.spring.io/spring-batch/trunk/reference/html/readersAndWriters.html

6.3.2过滤记录

项目处理器的一种典型用法是在将记录传递给ItemWriter之前过滤掉记录。过滤是一种不同于跳过的动作。跳过表示记录无效,而过滤仅表示不应写入记录。

例如,考虑一个批处理作业,它读取一个包含三种不同类型记录的文件:要插入的记录,要更新的记录和要删除的记录。如果系统不支持删除记录,则我们不希望将任何“删除”记录发送到ItemWriter。但是,由于这些记录实际上并不是不良记录,因此我们希望将其过滤掉,而不是跳过。结果,ItemWriter将仅接收“插入”和“更新”记录。

要过滤记录,只需从ItemProcessor返回“ null”即可。框架将检测到结果为“ null”,并避免将该项目添加到传递给ItemWriter的记录列表中。与往常一样,从ItemProcessor引发的异常将导致跳过。