我正在使用Spring-Batch
按csv
顺序阅读MultiResourceItemReader
个文件。
我想创建一个
的阅读器现在MultiResourceItemReader
的问题是它将首先以块的形式读取完整的file1,当文件完成后,它将继续使用file2。
如何创建基于chunksize在文件之间切换的批处理步骤?
答案 0 :(得分:1)
您需要创建一个自定义阅读器来解决您尝试的问题。您可以使用引擎盖下的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;
}
}
答案 1 :(得分:0)
您可以使用类似的
@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();
}