我创建了自定义ItemReader:
@Component("pricereader")
public class MyItemReader implements ItemReader<Price>{
@Override
public Price read() throws Exception, UnexpectedInputException, ParseException,
NonTransientResourceException {
// TODO Auto-generated method stub
return null;
}
}
在如此定义的工作中调用它:
<batch:job id="job1">
<batch:step id="step1">
<batch:tasklet>
<batch:chunk reader="pricereader" processor="priceprocessor" writer="pricewriter" commit-interval="1"/>
</batch:tasklet>
</batch:step>
</batch:job>
此itemReader必须解析外部文件中的数据。 我可以考虑这样的事情:
private Scanner scanner;
public MyItemReader(String filepath){
//initializing scanner
}
无论如何,我发现构造函数在spring初始化时调用,我不喜欢保持与内存中文件的开放连接的想法。 此外,我想使用这个ItemReader从多个文件中读取数据,因此在构造函数中添加这些信息也不是很好......任何想法?
答案 0 :(得分:2)
您所描述的正是ItemStream
接口的用途。 ItemStream
接口。 ItemStream
接口为Spring Batch组件的状态管理提供了便利。它包含open
,update
和close
方法,专门用于初始化状态,持久保存所需状态以及清理任何状态。在您的情况下,打开文件将在open
方法中完成,close
方法将处理关闭句柄。这些方法通过Spring Batch框架自动调用,并在FlatFileItemReader
等读者中用于相同的操作。
事实上,由于ItemStream
接口与teh ItemReader
接口的结合使用非常普遍,因此我们有一个扩展接口ItemStreamReader
。您可以在此处的文档中详细了解ItemStream
界面:http://docs.spring.io/spring-batch/trunk/reference/html/readersAndWriters.html#itemStream