簡體   English   中英

如何使用Spring-Batch讀取多個文件?

[英]How to read multiple files in chunks using Spring-Batch?

我正在使用Spring-Batch通過MultiResourceItemReader順序讀取csv文件。

我想創建一個讀者

  • 從文件1讀取chunksize
  • 從文件2讀取chunksize
  • 比較已讀取的內容並創建某種“補丁”對象
  • 將補丁對象寫入數據庫

現在, MultiResourceItemReader的問題在於它將首先以塊的形式讀取完整的file1,並且在文件完成后,它將繼續以file2進行讀取。

如何創建批處理步驟,以基於塊大小在文件之間切換?

您將需要創建一個自定義閱讀器來解決您的嘗試。 您可以在內部使用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;
    }
}

您可以使用類似

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM