如何使用Spring-Batch读取块中的多个文件?

时间:2014-11-13 14:10:26

标签: java spring spring-batch

我正在使用Spring-Batchcsv顺序阅读MultiResourceItemReader个文件。

我想创建一个

的阅读器
  • 从文件1中读取chunksize
  • 从文件2中读取chunksize
  • 比较已阅读的内容并创建某种“补丁”对象
  • 将补丁对象写入数据库

现在MultiResourceItemReader的问题是它将首先以块的形式读取完整的file1,当文件完成后,它将继续使用file2。

如何创建基于chunksize在文件之间切换的批处理步骤?

2 个答案:

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