你好有java向导,
我在进入春季批次时遇到了很多麻烦。现在直奔主题。我需要处理文件夹中的所有文件(xml),然后将它们写回,并添加少量内容。问题是我想保留输入文件名。我为此提供的解决方案是一个 MultiResourceItemReader,它委托给一个自定义 Itemreader,后者又调用 StaxEventItemReader 并返回一个包含编组的 xml 和文件名的自定义项。
问题:在无限循环中只读取同一个文件,另一个奇怪的事情是,每次重试10次。我知道一种解决方案是阅读器在读取文件后返回 null ,但这意味着我需要保留已处理文件的列表?
我想我现在会这样做,但我真的想要更聪明的东西。
作业配置:
<batch:job id="job1">
<batch:step id="step1" >
<batch:tasklet transaction-manager="transactionManager" start-limit="100" >
<batch:chunk reader="reader" writer="writer" commit-interval="10" />
</batch:tasklet>
</batch:step>
</batch:job>
<bean id="reader" class="org.springframework.batch.item.file.MultiResourceItemReader">
<property name="resources" value="files/*.xml" />
<property name="delegate" ref="myItemReader" />
</bean>
我的项目读取方法,基本上:
public class MyItemReader implements ResourceAwareItemReaderItemStream<MyItem>, ApplicationContextAware {
public MyItem read() throws Exception, UnexpectedInputException,
ParseException, NonTransientResourceException {
StaxEventItemReader<JAXBElement<RootObject>> reader = new StaxEventItemReader<JAXBElement<RootObject>>();
reader.setResource(currentResource);
reader.setFragmentRootElementName("RootObject");
// ... create jaxb unmarshaller
reader.setUnmarshaller(unmarshaller);
reader.setSaveState(true);
reader.afterPropertiesSet();
reader.open(executionContext);
JAXBElement<RootObject> jaxbElem = reader.read();
MyItem item = new MyItem();
item.setFilename(currentResource.getFile().getName());
item.setJaxbElement(jaxbElem);
return item;
}
}
任何人都可以在这里理顺我吗?
解决方案 所以最后我只保留一个读取文件的列表,如果它已经被读取,则返回 null 。至于一次读取 10 次,嗯,这是块的大小,所以它是有道理的。