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();
}