Comment ouvrir un Lecteur lors de la mise en œuvre de ItemReader dans un Spring Batch projet?
Dans un Spring Batch projet, je dois rédiger un dossier de plusieurs lignes. Je suis la mise en œuvre de ItemReader
accumuler plusieurs lignes avant de retourner un objet. Après avoir travaillé sur plusieurs projets j'ai reconstitué cette ensemble, mais je suis confronté à un ReaderNotOpenException
.
J'ai triple vérifié le chemin d'accès au fichier est correct. Quand je debug le delegate
contient la ressource et le chemin d'accès au fichier à partir de mon fichier de configuration.
Toute aide appréciée.
Fichier de Config:
<bean id="cvsFileItemReader" class="com.mkyong.XYZFileRecordReader">
<property name="delegate">
<bean class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="resource" value="classpath:ma/report-headeronly.psv" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean
class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="delimiter" value="|" />
</bean>
</property>
<property name="fieldSetMapper">
<bean class="org.springframework.batch.item.file.mapping.PassThroughFieldSetMapper" />
</property>
</bean>
</property>
</bean>
</property>
</bean>
Mon Lecteur:
package com.mkyong;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemStream;
import org.springframework.batch.item.ItemStreamException;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.transform.FieldSet;
import com.mkyong.model.XYZFileHeaderRecord;
public class XYZFileRecordReader implements ItemReader<XYZFileHeaderRecord>, ItemStream {
private FlatFileItemReader<FieldSet> delegate;
@Override
public XYZFileHeaderRecord read() throws Exception,
UnexpectedInputException, ParseException,
NonTransientResourceException {
XYZFileHeaderRecord maFileHeaderRecord = new XYZFileHeaderRecord();
for (FieldSet line = null; (line = this.delegate.read()) != null;) {
String firstToken = line.readString(0);
if (firstToken.equals("File ID")) {
maFileHeaderRecord.setFileName( line.readString(1) );
} else if (firstToken.equals("Date")) {
maFileHeaderRecord.setDate( line.readString(1) );
return maFileHeaderRecord;
}
}
return null;
}
@Override
public void close() throws ItemStreamException {}
@Override
public void open(ExecutionContext arg0) throws ItemStreamException {}
@Override
public void update(ExecutionContext arg0) throws ItemStreamException {}
public FlatFileItemReader<FieldSet> getDelegate() {
return delegate;
}
public void setDelegate(FlatFileItemReader<FieldSet> delegate) {
this.delegate = delegate;
}
}
Et mon stacktrace:
SEVERE: Encountered an error executing the step
org.springframework.batch.item.ReaderNotOpenException: Reader must be open before it can be read.
at org.springframework.batch.item.file.FlatFileItemReader.readLine(FlatFileItemReader.java:195)
at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:173)
at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:83)
at com.mkyong.XYZFileRecordReader.read(XYZFileRecordReader.java:26)
at com.mkyong.XYZFileRecordReader.read(XYZFileRecordReader.java:1)
at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:91)
at org.springframework.batch.core.step.item.SimpleChunkProvider.read(SimpleChunkProvider.java:155)
at org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:114)
at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
at org.springframework.batch.core.step.item.SimpleChunkProvider.provide(SimpleChunkProvider.java:108)
at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:69)
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:395)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:131)
at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:267)
at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:77)
at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:253)
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195)
at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:137)
at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64)
at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:60)
at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:152)
at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:131)
at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135)
at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:301)
at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:134)
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:49)
at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:127)
at com.mkyong.App.main(App.java:27)
Apr 25, 2014 5:35:56 PM org.springframework.batch.core.launch.support.SimpleJobLauncher$1 run
INFO: Job: [FlowJob: [name=reportJob]] completed with the following parameters: [{}] and the following status: [FAILED]
Exit Status : FAILED
Done
OriginalL'auteur yamori | 2014-04-25
Vous devez vous connecter pour publier un commentaire.
Votre délégué n'est pas ouvert. La façon la plus simple de régler ce problème est de mettre à jour le
open
,close
, etupdate
méthodes pour appeler la méthode correspondante sur le délégué. Cela permet aussi la possibilité de redémarrage (qui votre version actuelle ne serait pas parce que l'état du délégué n'est pas enregistrée):L'alternative est d'enregistrer votre
FlatFileItemReader
comme un flux dans votre démarche. Vous aurez à tirer sur un autre bean définition si vous voulez aller dans cette voie.Vous pouvez en lire plus à propos de
ItemStream
s et le comment de leur cycle de vie fonctionne et comment il est influencé par délégation: http://docs.spring.io/spring-batch/reference/html-single/index.html#itemStreamOriginalL'auteur Michael Minella
Vous devez appeler le délégué.open() pour effectuer l'ouverture de vrai lecteur. Ou vous pouvez vous inscrire délégué lecteur de streaming pour laisser SB gérer le délégué lecteur de flux du cycle de vie (lire chapitre 6.5)
OriginalL'auteur Luca Basso Ricci