Spring Batch ItemReader liste traitée qu'une seule fois
Je suis en train de créer un Ressort de traitement par Lots à l'aide d'un ListItemReader<String>
, ItemProcessor<String, String>
et ItemWriter<String>
.
Le XML ressemble à celui-ci,
<job id="sourceJob" xmlns="http://www.springframework.org/schema/batch">
<step id="step1" next="step2">
<tasklet>
<chunk reader="svnSourceItemReader"
processor="metadataItemProcessor"
writer="metadataItemWriter"
commit-interval="1" />
</tasklet>
</step>
<step id="step2">
<tasklet ref="lastRevisionLoggerTasklet"></tasklet>
</step>
</job>
<bean id="svnSourceItemReader"
class="com.example.repository.batch.SvnSourceItemReader"
scope="prototype">
<constructor-arg index="0">
<list>
<value>doc1.xkbml</value>
<value>doc2.xkbml</value>
<value>doc3.xkbml</value>
</list>
</constructor-arg>
</bean>
<bean id="metadataItemProcessor"
class="com.example.repository.batch.MetadataItemProcessor"
scope="prototype" />
<bean id="metadataItemWriter"
class="com.example.repository.batch.MetadataItemWriter"
scope="prototype" />
Le lecteur, le processeur et l'écrivain sont à la vanille,
public class SvnSourceItemReader extends ListItemReader<String> {
public SvnSourceItemReader(List<String> list) {
super(list);
System.out.println("Reading data list " + list);
}
@Override
public String read() {
String out = (String) super.read();
System.out.println("Reading data " + out);
return out;
}
}
public class MetadataItemProcessor implements ItemProcessor<String, String> {
@Override
public String process(String i) throws Exception {
System.out.println("Processing " + i + " : documentId " + documentId);
return i;
}
}
public class MetadataItemWriter implements ItemWriter<String> {
@Override
public void write(List<? extends String> list) throws Exception {
System.out.println("Writing " + list);
}
}
Le travail est commencé comme ça, mais sur un calendrier de toutes les 10 secondes.
long nanoBits = System.nanoTime() % 1000000L;
if (nanoBits < 0) {
nanoBits *= -1;
}
String dateParam = new Date().toString() + System.currentTimeMillis()
+ "." + nanoBits;
param = new JobParametersBuilder().addString("date", dateParam)
.toJobParameters();
JobExecution execution = jobLauncher.run(job, param);
Lorsque l'application démarre, je le vois lire, traiter et à écrire chacun des trois éléments de la liste passée pour le lecteur.
Reading data doc1.xkbml
Processing doc1.xkbml : documentId doc1
Writing [doc1.xkbml]
Reading data doc2.xkbml
Processing doc2.xkbml : documentId doc2
Writing [doc2.xkbml]
Reading data doc3.xkbml
Processing doc3.xkbml : documentId doc3
Writing [doc3.xkbml]
Parce que ce sourceJob
est sur un minuteur planifiée, toutes les 10 secondes, je m'attendais à voir que la liste des traités, mais à la place je vois sur toutes les pistes.
Reading data null
Personne ne sait pourquoi ce qui se passe? Je suis nouveau sur Spring Batch et juste ne pouvez pas obtenir mes mains autour de la question.
Grâce /w
OriginalL'auteur wsams | 2013-08-29
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous avez marqué votre lecteur de
scope="prototype"
. Il devrait êtrescope="step"
.Au Printemps-lot il y a seulement deux périmètres:
singleton
(par défaut) etstep
.De la javadoc:
et
Au cours du Printemps contexte de démarrage de regarder votre journal et vous verrez cette ligne:
comme vous pouvez le voir, votre lecteur a déjà été créé et est géré comme un singleton; dynamique des haricots au printemps-lot de contexte doit être géré avec la
step
champ d'application de sorte que le Printemps va créer une nouvelle copie de la fève à chaque fois qu'une étape est exécutée.Dans votre lecteur,
ListItemReader.read()
est écrit que:Dans chacun de lire les éléments sont supprimés de la liste originale! Le lecteur est construit à la fois et, sur deuxième exécution du travail, la liste est vide!
Grand. Peut-on utiliser ListItemReader en multi-thread étape pour traiter les éléments de la liste en même temps ? Va redémarrer travailler pour elle ?
Nope. ListItemReader n'est pas en mode redémarrage, car il ne prend pas en charge ItemStrem; cette classe (à partir de javadoc) est 'Utile pour le test'
OriginalL'auteur Luca Basso Ricci
Juste un informations supplémentaires: vous pouvez également utiliser JavaConfig au lieu du fichier de configuration xml, et d'annoter le lecteur bean déclaration avec @StepConfig.
ex:
OriginalL'auteur AmineM