Spring Batch - Valider les Lignes d'en-Tête d'entrée de fichier csv et ignorer le fichier si il invalide
J'ai un travail simple comme ci-dessous:
<batch:step id="step">
<batch:tasklet>
<batch:chunk reader="itemReader" processor="itemProcessor" writer="itemWriter" commit- interval="5000" />
</batch:tasklet>
</batch:step>
itemReader est comme ci-dessous:
<bean id="itemReader" class="org.springframework.batch.item.file.FlatFileItemReader"
scope="step">
<property name="linesToSkip" value="1"></property>
<property name="skippedLinesCallback" ref="skippedLinesCallback" ></property>
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer" ref="lineTokenizer">
<property name="delimiter" value="," />
</bean>
</property>
<property name="fieldSetMapper">
<bean
class="org.springframework.batch.item.file.mapping.PassThroughFieldSetMapper" />
</property>
</bean>
</property>
<property name="resource" value="#{stepExecutionContext['inputKeyName']}" />
</bean>
<bean id"lineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<bean id="skippedLinesCallback" class="com.test.IteMReaderHeader" >
<property name="lineTokenizer" ref="lineTokenizer">
</bean>
Je suis en train de les "noms" des champs de saisie dans "com.test.IteMReaderHeader" de la classe par l'injection de "lineTokenizer".
J'ai besoin de valider les lignes d'en-tête qui est la 1ère ligne dans l'entrée de fichier csv avec un en-tête fixe de la valeur et si la ligne d'en-tête invalide, alors dans ce cas j'ai besoin d'échec de l'étape et de passer la totalité de fichier, de sorte que le prochain fichier peut être utilisé pour la lecture.
Veuillez suggérer la manière de l'atteindre.
J'apprécierais vraiment votre temps et de votre précieuse contribution.
Merci !!
OriginalL'auteur grathi | 2013-08-29
Vous devez vous connecter pour publier un commentaire.
À la recherche de code de
FlatFileItemReader
fichier de condition d'arrêt est géré;boolean noInput
function readLine()
utilisé dans les aires protégéesdoRead()
À mon humble avis, la meilleure solution est de lancer une exception d'exécution à partir de votre skippedLineCallback et de gérer l'erreur en tant que lecteur de l'épuisement condition.
Ennemi exemple de la rédaction de votre délégué de cette façon
(vous devez vous inscrire délégué flux manuellement,bien sûr)
ou à l'extension de
FlatFileItemReader
commeLe code a été écrit directement, sans test, alors il y a peut être des erreurs, mais j'espère que vous comprenez mon point.
L'espoir peut résoudre votre problème
Peut-être maintenir headerError valeur dans l'étape (ou de travail), le contexte d'exécution et de le gérer dans doOpen()/doUpdate()/doClose() ou avec un écouteur. Je n'ai jamais essayé, désolé.
Utile. Merci @LucaBassoRicci
OriginalL'auteur Luca Basso Ricci