如何根据平面文件的名称来拥有两个不同的阅读器

时间:2019-05-31 12:40:24

标签: spring-batch filereader

我正在尝试实现一种在Spring Batch中读取同一存储库中两种不同类型的csv文件的方法。

我有两个FlatFileItemReader用于两种不同类型的文件。

我尝试使用ResourceAwareItemReaderItemStream:

public class ReaderDispatcher<T> implements ResourceAwareItemReaderItemStream<T> {
    private ResourceAwareItemReaderItemStream<? extends T> reader1;
    private ResourceAwareItemReaderItemStream<? extends T> reader2;
    private ResourceAwareItemReaderItemStream<? extends T> currentReader;
    private Resource resource;

    @Override
    public void setResource(Resource resource) {
        this.resource = resource;
        currentReader = getDelegateFromResource();

    }

    @Override
    public T read() throws Exception {
        return currentReader.read();
    }

    private ResourceAwareItemReaderItemStream<? extends T> getDelegateFromResource() {

        if (resource.getFilename().contains("NAME1")) {
            return reader1;
        }

        if (resource.getFilename().contains("NAME2")) {
            return reader2;
        }

        return null;
    }


    public void setReader1(ResourceAwareItemReaderItemStream<? extends T> reader1) {
        this.reader1 = reader1;
    }

    public void setReader2(ResourceAwareItemReaderItemStream<? extends T> reader2) {
        this.reader2 = reader2;
    }

    @Override
    public void open(ExecutionContext executionContext) {
        if (currentReader != null) {
            currentReader.open(executionContext);
        }
    }

    @Override
    public void update(ExecutionContext executionContext) {
        if (currentReader != null) {
            currentReader.update(executionContext);
        }
    }

    @Override
    public void close() {
        if (currentReader != null) {
            currentReader.close();
        }
    }
}

这是应用程序上下文:

    <bean id="multiCsvReader" class="org.springframework.batch.item.file.MultiResourceItemReader" scope="step">
        <property name="resources" value="file:${dir.input}/*"/>
        <property name="delegate" ref="readerDispatcher" />
    </bean>

    <bean id="readerDispatcher" class="fr.edfgdf.tamaris.springbatch.recuperationinfodiginko.reader.ReaderDispatcher" scope="step">
        <property name="reader1" ref="infoReader1" />
        <property name="reader2" ref="infoReader2" />
    </bean>

    <bean id="infoReader1" class="fr.edfgdf.tamaris.springBatch.common.reader.FlatFileWithResourceItemReader" scope="step">
        <properties for reader1 with mapper1>
    </bean>

    <bean id="infoReader2" class="fr.edfgdf.tamaris.springBatch.common.reader.FlatFileWithResourceItemReader" scope="step">
        <properties for reader2 with mapper2>
    </bean>

我希望第一个阅读器用于名称中带有“ NAME1”的文件,第二个阅读器用于名称“ NAME2”。但是,出现此错误:

org.springframework.batch.item.ItemStreamException: Failed to initialize the reader
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:142)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

...
Caused by: java.lang.IllegalArgumentException: Input resource must be set
    at org.springframework.util.Assert.notNull(Assert.java:112)
    at org.springframework.batch.item.file.FlatFileItemReader.doOpen(FlatFileItemReader.java:245)
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:139)
    ... 68 more

你能帮忙吗?

0 个答案:

没有答案