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

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

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

这类似于FlatFileItemReader

然后,读取的MyEntity将由JdbcItemReader持久保存到DB。

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

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

那么:如果我不能返回null,我可以通过读取器内的条件跳过特定行? 因为读者的性质,我不得不在这里归还一个物体。

我认为过滤一些行的好习惯是不是使用读者而是使用处理器(当你想要过滤行时你可以返回null)。

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

6.3.2过滤记录

项目处理器的一个典型用途是在将记录传递给ItemWriter之前过滤掉记录。 过滤是一种与跳过不同的行为; 跳过表示记录无效,而过滤只表示不应写入记录。

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

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

对于我使用自定义阅读器的更一般情况,我遇到了类似的问题。 它由对象类型的迭代器支持,并为每个读取的对象返回一个新项(不同类型)。 问题是这些对象中的一些没有映射到任何东西,所以我想返回标记它的东西。

最后我决定定义一个INVALID_ITEM并返回它。 另一种方法可能是在read()方法中推进迭代器,直到下一个有效项,如果.hasNext()变为false,则返回null,但这更麻烦。

最初我还试图返回一个自定义的ecxeption并告诉Spring跳过它上面的项目,但它似乎被忽略了,所以我放弃了(如果有太多的残疾人无论如何都不是高性能的)。

在这种情况下(在阅读完所有评论后),我认为你不能吃蛋糕并且吃它。 通过最佳意见(如建议的那样)抛出自定义exception并跳过’on it’。 您可以在其他地方优化您的实体创建或流程,这样您就不会失去如此多的性能。 祝你好运。