Spring 批处理:带有自定义 ItemReader 的 MultiResourceItemReader 无限读取同一个文件
Spring Batch: MultiResourceItemReader with custom ItemReader reads the same file ad infinitum
我有一个 MultiResourceItemReader,将自定义 ItemReader 作为委托。我面临的问题是,当我启动作业时,同一个文件被一遍又一遍地读取。
这是代表 class:
public class AllegatiReader implements ResourceAwareItemReaderItemStream<Allegato> {
@PersistenceContext
protected EntityManager em;
private Resource resource;
@Override
public void close() throws ItemStreamException {
}
@Override
public void open(ExecutionContext arg0) throws ItemStreamException {
}
@Override
public void update(ExecutionContext arg0) throws ItemStreamException {
}
@Override
public Allegato read() throws Exception, UnexpectedInputException,
ParseException, NonTransientResourceException {
// DO SOMETHING ...
byte[] fileContent = new byte[(int) resource.getFile().length()];
resource.getInputStream().read(fileContent);
resource.getInputStream().close();
allegato.getFile().setFile(fileContent);
return allegato;
}
@Override
public void setResource(Resource arg0) {
this.resource = arg0;
}
}
这是我的 Spring 批处理 XML 配置文件:
<batch:job id="allegati" incrementer="jobParametersIncrementer">
<batch:step id="allegati-import">
<batch:tasklet>
<batch:chunk reader="allegati-reader" writer="allegati-writer" commit-interval="1"/>
</batch:tasklet>
</batch:step>
</batch:job>
<bean id="allegati-reader" class="org.springframework.batch.item.file.MultiResourceItemReader" scope="step">
<property name="resources" value="file:#{jobParameters['FILEPATH']}/*" />
<property name="delegate" ref="allegati-filereader" />
</bean>
<bean id="allegati-writer" class="org.springframework.batch.item.database.JpaItemWriter">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="allegati-filereader" class="it.infogroup.vertenze.porting.reader.AllegatiReader" />
如何让 Spring Batch 移动到下一个文件?
您的自定义 reader 必须在所有完成后显示 Spring 批次,请参阅 http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/ItemReader.html#read--
Reads a piece of input data and advance to the next one.
Implementations must return null at the end of the input data set.
在你的情况下,我会使用一个私有属性来保存* 这个 reader 实例的资源被处理的状态,它可能是 Allegato 对象,但这似乎是一个相当大的
*) 你的 reader 是有状态的,所以另一个状态属性应该没问题
我有一个 MultiResourceItemReader,将自定义 ItemReader 作为委托。我面临的问题是,当我启动作业时,同一个文件被一遍又一遍地读取。
这是代表 class:
public class AllegatiReader implements ResourceAwareItemReaderItemStream<Allegato> {
@PersistenceContext
protected EntityManager em;
private Resource resource;
@Override
public void close() throws ItemStreamException {
}
@Override
public void open(ExecutionContext arg0) throws ItemStreamException {
}
@Override
public void update(ExecutionContext arg0) throws ItemStreamException {
}
@Override
public Allegato read() throws Exception, UnexpectedInputException,
ParseException, NonTransientResourceException {
// DO SOMETHING ...
byte[] fileContent = new byte[(int) resource.getFile().length()];
resource.getInputStream().read(fileContent);
resource.getInputStream().close();
allegato.getFile().setFile(fileContent);
return allegato;
}
@Override
public void setResource(Resource arg0) {
this.resource = arg0;
}
}
这是我的 Spring 批处理 XML 配置文件:
<batch:job id="allegati" incrementer="jobParametersIncrementer">
<batch:step id="allegati-import">
<batch:tasklet>
<batch:chunk reader="allegati-reader" writer="allegati-writer" commit-interval="1"/>
</batch:tasklet>
</batch:step>
</batch:job>
<bean id="allegati-reader" class="org.springframework.batch.item.file.MultiResourceItemReader" scope="step">
<property name="resources" value="file:#{jobParameters['FILEPATH']}/*" />
<property name="delegate" ref="allegati-filereader" />
</bean>
<bean id="allegati-writer" class="org.springframework.batch.item.database.JpaItemWriter">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="allegati-filereader" class="it.infogroup.vertenze.porting.reader.AllegatiReader" />
如何让 Spring Batch 移动到下一个文件?
您的自定义 reader 必须在所有完成后显示 Spring 批次,请参阅 http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/ItemReader.html#read--
Reads a piece of input data and advance to the next one. Implementations must return null at the end of the input data set.
在你的情况下,我会使用一个私有属性来保存* 这个 reader 实例的资源被处理的状态,它可能是 Allegato 对象,但这似乎是一个相当大的
*) 你的 reader 是有状态的,所以另一个状态属性应该没问题