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 null在read()阅读器的方法内部时,不仅会跳过此项目,而且会完全终止阅读,并且将跳过所有其他行。因为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引发的异常将导致跳过。
| 归档时间: |
|
| 查看次数: |
8648 次 |
| 最近记录: |