我正在尝试实现一种在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
你能帮忙吗?