如何正确遍历StaxEventItemReader/ItemReader无需预先指定元素数量
正确遍历StaxEventItemReader的两种方案
方案1:使用临时变量存储单次读取结果(最推荐)
原有写法的问题在于每轮循环会调用2次read()方法,每次调用都会触发游标前移,导致奇数位条目直接被跳过。只要把单次读取结果存入临时变量,基于变量做非空判断即可,不需要提前知晓条目总数:
Object currentItem; // 每轮循环仅调用1次read(),结果存入变量后再做判断和处理 while ((currentItem = objectStaxEventItemReader.read()) != null) { invokeRandomMethod(currentItem); }
该方案无额外依赖和性能开销,适配所有实现了ItemReader接口的读取器,是通用遍历写法。
方案2:包装为PeekableItemReader实现预读
如果业务逻辑确实需要在正式读取前先判断下一条是否存在、或者预取下一条内容做逻辑判断,可以用Spring Batch自带的SingleItemPeekableItemReader包装原有StaxEventItemReader,无需自己实现peek能力:
SingleItemPeekableItemReader<Object> peekableReader = new SingleItemPeekableItemReader<>(); // 委托原有StaxEventItemReader做实际读取 peekableReader.setDelegate(objectStaxEventItemReader); // 手动初始化配置(如果是Spring托管的Bean可省略该步,会自动调用初始化方法) peekableReader.afterPropertiesSet(); // 用peek方法预读判断,不会消费游标 while (peekableReader.peek() != null) { Object currentItem = peekableReader.read(); invokeRandomMethod(currentItem); }
内容的提问来源于stack exchange,提问作者Tom Steger
相关产品推荐
相关产品推荐

