Java 如何使用Spring批处理以块的形式读取多个文件?
我正在使用Java 如何使用Spring批处理以块的形式读取多个文件?,java,spring,spring-batch,Java,Spring,Spring Batch,我正在使用Spring批处理按顺序使用MultiResourceItemReader读取csv文件 我想创建一个 从文件1读取chunksize 从文件2中读取chunksize 比较已读取的内容并创建某种“补丁”对象 将修补程序对象写入数据库 现在,MultiResourceItemReader的问题是,它将首先分块读取完整的文件1,当文件完成时,它将继续读取文件2 如何创建基于chunksize在文件之间切换的批处理步骤?您需要创建一个自定义读取器来解决您正在尝试的问题。您可以在引擎盖下
Spring批处理
按顺序使用MultiResourceItemReader
读取csv
文件
我想创建一个
- 从文件1读取chunksize
- 从文件2中读取chunksize
- 比较已读取的内容并创建某种“补丁”对象
- 将修补程序对象写入数据库
MultiResourceItemReader
的问题是,它将首先分块读取完整的文件1,当文件完成时,它将继续读取文件2
如何创建基于chunksize在文件之间切换的批处理步骤?您需要创建一个自定义读取器来解决您正在尝试的问题。您可以在引擎盖下使用
FlatFileItemReader
进行实际的文件读取,但同时读取两个文件的逻辑必须由您自己进行编排。只是在我的头顶上写下代码,我期待着这样的事情:
public class MultiFileReader implements ItemReader<SomeObject> {
private List<ItemStreamReader> readers;
public SomeObject read() {
SomeObject domainObject = new SomeObject();
for(ItemStreamReader curReader : readers) {
domainObject.add(curReader.read());
}
return domainObject;
}
}
公共类多文件阅读器实现ItemReader{
私人列表阅读器;
公共对象读取(){
SomeObject domainObject=新的SomeObject();
for(ItemStreamReader当前阅读器:阅读器){
add(curReader.read());
}
返回域对象;
}
}
您可以使用
@Bean
public MultiResourceItemReader<Company> readerCompany() throws IOException {
DelimitedLineTokenizer dlt = new DelimitedLineTokenizer();
dlt.setDelimiter("^");
dlt.setNames("name", "cui", "code", "euid", "companyState", "address");
dlt.setStrict(false);
return new MultiResourceItemReaderBuilder<Company>()
.name("readerCompany")
.resources(inputCompanyResources)
.delegate(new FlatFileItemReaderBuilder<Company>()
.name("getCompanyStatusReader")
.fieldSetMapper(new FieldSetMapper<Company>() {
@Override
public Company mapFieldSet(FieldSet fieldSet) throws BindException {
return Company.builder()
.name(fieldSet.readString("name"))
.localId(fieldSet.readString("cui"))
.code(fieldSet.readString("code"))
.companyStatus(readCompanyStatuses(fieldSet.readString("companyState")))
.address(fieldSet.readString("address"))
.internationalId(fieldSet.readString("euid"))
.build();
}
})
.linesToSkip(1)
.lineTokenizer(dlt)
.build())
.build();
}
@Bean
公共MultiResourceItemReader readerCompany()引发IOException{
DelimitedLineTokenizer dlt=新的DelimitedLineTokenizer();
dlt.setDelimiter(“^”);
数据集名称(“名称”、“cui”、“代码”、“euid”、“公司状态”、“地址”);
dlt.setStrict(假);
返回新的MultiResourceItemReaderBuilder()
.名称(“阅读公司”)
.资源(inputCompanyResources)
.delegate(新的FlatFileItemReaderBuilder()
.name(“getCompanyStatusReader”)
.fieldSetMapper(新的fieldSetMapper(){
@凌驾
上市公司mapFieldSet(FieldSet FieldSet)引发BindException{
returncompany.builder()
.name(fieldSet.readString(“name”))
.localId(fieldSet.readString(“cui”))
.code(fieldSet.readString(“code”))
.companyStatus(readcompanystates(fieldSet.readString(“companyState”))
.address(fieldSet.readString(“地址”))
.internationalId(fieldSet.readString(“euid”))
.build();
}
})
.linesToSkip(1)
.lineTokenizer(dlt)
.build())
.build();
}