Spring Batch: Ignorer toute la ligne qui ne correspond pas au modèle spécifié
J'ai une exigence d'où j'ai lu un fichier avec différents types d'entrée comme ci-dessous:
*JAMBEG,APP=000007,123456
AC,654321,“ABCD12121212121212”,23423423423424234,ABCDD,23423423423424234,2424,XYZ,ABC,TREX,000000002
AC,654321,“ABCD12121212121213”,23423423423424234,ABCDD,23423423423424234,2424,XYZ,ABC, TREX,000000002
...
AC,654321,“ABCD12121212121214”,23423423423424234,ABCDD,23423423423424234,2424,XYZ,ABC, TREX,000000002
*JAMEND,APP=000007,123456
EOF
J'ai besoin seulement de la ligne d'en-Tête et les dossiers suivants qui, ignorant la ligne qui commence avec TREX, *JAMEND, les expressions du FOLKLORE.
Ici est de savoir comment ma ligne de mapper est:
public LineMapper<Customer> lineMapper(){
DelimitedLineTokenizer lineTokenizerHeader = new DelimitedLineTokenizer();
lineTokenizerHeader.setNames(new String[]{"association","companyNumber","fileDate"});
lineTokenizerHeader.setIncludedFields(new int[]{0,1,2});
lineTokenizerHeader.setStrict(false);
DelimitedLineTokenizer lineTokenizerBody = new DelimitedLineTokenizer();
lineTokenizerBody.setNames(new String[]{"type","acNumber","orderNumber"});
lineTokenizerBody.setIncludedFields(new int[]{0,1,2});
lineTokenizerBody.setStrict(false);
HashMap<String, DelimitedLineTokenizer> tokenizers = new HashMap<String, DelimitedLineTokenizer>();
tokenizers.put("*BEG*", lineTokenizerHeader);
tokenizers.put("AC*", lineTokenizerBody);
BeanWrapperFieldSetMapper<Customer> beanWrapperFieldSetMapper = new BeanWrapperFieldSetMapper<Customer>();
beanWrapperFieldSetMapper.setTargetType(Customer.class);
beanWrapperFieldSetMapper.setStrict(false);
HashMap<String, BeanWrapperFieldSetMapper<Customer>> fieldSetMappers = new HashMap<String, BeanWrapperFieldSetMapper<Customer>>();
fieldSetMappers.put("*BEG*", beanWrapperFieldSetMapper);
fieldSetMappers.put("AC*", beanWrapperFieldSetMapper);
PatternMatchingCompositeLineMapper patternMatchingCompositeLineMapper = new PatternMatchingCompositeLineMapper();
patternMatchingCompositeLineMapper.setTokenizers(tokenizers);
patternMatchingCompositeLineMapper.setFieldSetMappers(fieldSetMappers);
return patternMatchingCompositeLineMapper;
}
Ses mon erreur évidente que je n'ai pas de cartographie pour TREX, *JAMEND, EOF modèles. Par conséquent, il jette le ci-dessous exception:
2014-06-16 16:49:34,746 [principal] DEBUG
org.springframework.lot.de base.étape.de l'élément.FaultTolerantChunkProvider -
L'analyse de l'erreur à la ligne: 5 en ressources=[chemin de classe de ressource
[0000123456.csv]], input=[EOF] :
org.springframework.lot.de l'élément.fichier.FlatFileParseException 2014-06-16
16:49:34,746 [principal] DEBUG
org.springframework.lot.de base.étape.de l'élément.FaultTolerantChunkProvider -
Sauter a échoué d'entrée
org.springframework.lot.de l'élément.fichier.FlatFileParseException: Analyse D'
erreur à la ligne: 5 en ressources=[chemin de classe de ressource [0000123456.csv]],
entrée=[EOF]
org.springframework.lot.de l'élément.fichier.FlatFileItemReader.doRead(FlatFileItemReader.java:183)
au
org.springframework.batch.item.support.AbstractItemCountingItemStreamItemreader.read(AbstractItemCountingItemStreamItemreader.java:83)
au
org.springframework.lot.de base.étape.de l'élément.SimpleChunkProvider.doRead(SimpleChunkProvider.java:91)
au
org.springframework.batch.core.step.item.FaultTolerantChunkProvider.read(FaultTolerantChunkProvider.java:87)
au
org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:114)
au
org.springframework.lot.répétez.de soutien.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
au
org.springframework.lot.répétez.de soutien.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
au
org.springframework.lot.répétez.de soutien.RepeatTemplate.iterate(RepeatTemplate.java:144)
au
org.springframework.lot.de base.étape.de l'élément.SimpleChunkProvider.fournir(SimpleChunkProvider.java:108)
au
org.springframework.lot.de base.étape.de l'élément.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:69)
au
org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:402)
au
org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:326)
au
org.springframework.des transactions.de soutien.TransactionTemplate.execute(TransactionTemplate.java:130)
au
org.springframework.lot.de base.étape.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:267)
au
org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:77)
au
org.springframework.lot.répétez.de soutien.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
au
org.springframework.lot.répétez.de soutien.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
au
org.springframework.lot.répétez.de soutien.RepeatTemplate.iterate(RepeatTemplate.java:144)
au
org.springframework.lot.de base.étape.tasklet.TaskletStep.doExecute(TaskletStep.java:253)
au
org.springframework.lot.de base.étape.AbstractStep.execute(AbstractStep.java:198)
au
org.springframework.lot.de base.travail.SimpleStepHandler.handleStep(SimpleStepHandler.java:148)
au
org.springframework.lot.de base.travail.AbstractJob.handleStep(AbstractJob.java:386)
au
org.springframework.lot.de base.travail.SimpleJob.doExecute(SimpleJob.java:135)
au
org.springframework.lot.de base.travail.AbstractJob.execute(AbstractJob.java:304)
au
org.springframework.lot.de base.de lancement.de soutien.SimpleJobLauncher$1.exécuter(SimpleJobLauncher.java:135)
au
org.springframework.de base.de la tâche.SyncTaskExecutor.execute(SyncTaskExecutor.java:48)
au
org.springframework.lot.de base.de lancement.de soutien.SimpleJobLauncher.exécuter(SimpleJobLauncher.java:128)
au coucher du soleil.de réfléchir.NativeMethodAccessorImpl.invoke0(Native method) at
soleil.de réfléchir.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
au
soleil.de réfléchir.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
à java.lang.de réfléchir.La méthode.invoke(la Méthode.java:597) à
org.springframework.aop.de soutien.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
au
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
au
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
au
org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:117)
au
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
au
org.springframework.aop.cadre.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
au com.soleil.proxy.$Proxy17.run(Unknown Source) at
com.chofac.pm.lot.CustomerFileToDBJobTest.testLaunchJob(CustomerFileToDBJobTest.java:48)
au coucher du soleil.de réfléchir.NativeMethodAccessorImpl.invoke0(Native method) at
soleil.de réfléchir.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
au
soleil.de réfléchir.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
à java.lang.de réfléchir.La méthode.invoke(la Méthode.java:597) à
org.junit.les coureurs.de modèle.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
au
org.junit.interne.les coureurs.de modèle.ReflectiveCallable.exécuter(ReflectiveCallable.java:15)
au
org.junit.les coureurs.de modèle.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
au
org.junit.interne.les coureurs.des déclarations.InvokeMethod.évaluer(InvokeMethod.java:20)
au
org.junit.interne.les coureurs.des déclarations.RunBefores.évaluer(RunBefores.java:28)
au
org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
au
org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
au
org.springframework.test.contexte.junit4.des déclarations.SpringRepeat.évaluer(SpringRepeat.java:72)
au
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
au
org.junit.les coureurs.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
au org.junit.les coureurs.ParentRunner$3.exécuter(ParentRunner.java:231) à
org.junit.les coureurs.ParentRunner$1.annexe(ParentRunner.java:60) à
org.junit.les coureurs.ParentRunner.runChildren(ParentRunner.java:229) à
org.junit.les coureurs.ParentRunner.l'accès$000(ParentRunner.java:50) à
org.junit.les coureurs.ParentRunner$2.évaluer(ParentRunner.java:222) à
org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
au
org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
au org.junit.les coureurs.ParentRunner.exécuter(ParentRunner.java:300)
org.springframework.test.contexte.junit4.SpringJUnit4ClassRunner.exécuter(SpringJUnit4ClassRunner.java:174)
au
org.eclipse.jdt.interne.junit4.runner.JUnit4TestReference.exécuter(JUnit4TestReference.java:50)
au
org.eclipse.jdt.interne.junit.runner.TestExecution.exécuter(TestExecution.java:38)
au
org.eclipse.jdt.interne.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
au
org.eclipse.jdt.interne.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
au
org.eclipse.jdt.interne.junit.runner.RemoteTestRunner.exécuter(RemoteTestRunner.java:390)
au
org.eclipse.jdt.interne.junit.runner.RemoteTestRunner.principale(RemoteTestRunner.java:197)
Causés par: java.lang.IllegalStateException: impossible de trouver une correspondance
modèle de clé=[EOF]
org.springframework.lot.de soutien.PatternMatcher.match(PatternMatcher.java:226)
au
org.springframework.batch.item.file.mapping.PatternMatchingCompositeLineMapper.mapLine(PatternMatchingCompositeLineMapper.java:62)
au
org.springframework.lot.de l'élément.fichier.FlatFileItemReader.doRead(FlatFileItemReader.java:180)
... 67 plus
J'ai regardé de nombreux exemples, cette une appariés à proximité, et a changé ma démarche en tant que ci-dessous, mais toujours le même problème.
@Bean
public Step step(){
return stepBuilders.get("step")
.<Customer,Customer>chunk(1)
.reader(CustomerAUFileReader())
.faultTolerant()
.skipLimit(3)
.skip(Exception.class)
.processor(CustomerRecordProcessor())
.writer(CustomerDBWriter())
.listener(logProcessListener())
.build();
}
Regardé le Printemps.io docs ici pour sauter de dossiers (5.1.5 la Configuration de la Logique de Saut), ne fonctionne pas non plus.
S'il vous plaît laissez-moi savoir le moyen idéal pour obtenir autour de cette question. Ne doit-il pas être un moyen facile de spécifier sauter les enregistrements qui ne correspondent pas à des cas spécifiques? Veuillez informer. Merci.
---
J'ai un modèle de mapper pour '*' qui je suis cartographie avec un mannequin de classe. Je suis de retour null lors de l'étape de processus, mais son lancement nullpointerexception.
Trace De La Pile:
2014-06-17 10:03:01,690 [main] DEBUG org.springframework.batch.core.step.item.FaultTolerantChunkProcessor - Skipping after failed process
org.springframework.batch.core.listener.StepListenerFailedException: Error in afterProcess.
at org.springframework.batch.core.listener.MulticasterBatchListener.afterProcess(MulticasterBatchListener.java:136)
at org.springframework.batch.core.step.item.SimpleChunkProcessor.doProcess(SimpleChunkProcessor.java:127)
at org.springframework.batch.core.step.item.FaultTolerantChunkProcessor$1.doWithRetry(FaultTolerantChunkProcessor.java:225)
at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:263)
at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:193)
at org.springframework.batch.core.step.item.BatchRetryTemplate.execute(BatchRetryTemplate.java:217)
at org.springframework.batch.core.step.item.FaultTolerantChunkProcessor.transform(FaultTolerantChunkProcessor.java:290)
at org.springframework.batch.core.step.item.SimpleChunkProcessor.process(SimpleChunkProcessor.java:192)
at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:75)
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:402)
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:326)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130)
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:198)
at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:148)
at org.springframework.batch.core.job.AbstractJob.handleStep(AbstractJob.java:386)
at org.springframework.batch.core.job.SimpleJob.doExecute(SimpleJob.java:135)
at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:304)
at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:135)
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:48)
at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:128)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:117)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at com.sun.proxy.$Proxy17.run(Unknown Source)
at com.chofac.pl.batch.CustomerFileToDBJobTest.testLaunchJob(CustomerFileToDBJobTest.java:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.NullPointerException
at com.chofac.pl.batch.CustomerItemProcessListener.afterProcess(CustomerItemProcessListener.java:13)
at org.springframework.batch.core.listener.CompositeItemProcessListener.afterProcess(CompositeItemProcessListener.java:60)
at org.springframework.batch.core.listener.MulticasterBatchListener.afterProcess(MulticasterBatchListener.java:133)
OriginalL'auteur oneworld | 2014-06-17
Vous devez vous connecter pour publier un commentaire.
Une approche:
Votre
ItemReader
il suffit de lire une ligne et de retour que est. Par conséquent, les éléments donnés par le lecteur sera une simple Chaîne de caractères.D'écrire une simple
ItemProcessor
, qui a surtout faire le travail de votreLineMapper
, base sur un modèle par exemple: si l'article correspond à un modèle, puis traduire la chaîne d'entrée à votreCustomer
retour. Si le modèle ne correspond pas, il suffit de retournernull
et l'article sera ignorée.pseudo code de l'élément de processeur:
Ou même plus propre: avoir un processeur de faire le travail de cartographie de la Chaîne de la Clientèle, et un autre processeur pour procéder à la validation de la chaîne de base sur les regex.
juste de la chaîne des processeurs à l'aide d'un
CompositeItemProcessor
. Cela donne une meilleure séparation des préoccupations de chaque de votre processeur.OriginalL'auteur Adrian Shum
Votre intention est de ne pas sauter de l'objet en raison des erreurs, mais ignorer les enregistrements avec une logique; je pense que la meilleure solution est de mettre un mappeur liées à la
'*'
et retourner un objet personnalisé (comme unSkippableRecordBean
) au lieu d'unCustomer
et de filtrer tous les haricots dansItemProcessor
.OriginalL'auteur Luca Basso Ricci
J'ai un problème similaire, où le dossier, je suis envoyé aura toujours des lignes qui ne correspondent pas à la configuration correcte. Comme je viens de le vouloir ignorer ces lignes, je me connecte, et de les ignorer.
Vous pouvez mettre en œuvre
org.springframework.batch.repeat.exception.ExceptionHandler
comme tel:puis ajoutez-le à votre étape constructeur:
OriginalL'auteur MattC
Nous avons commencé à retourner objet fictif de la LineMapper au lieu de null null entraîne le lecteur à sauter en lisant d'autres lignes. Dans le ItemWriter, la méthode d'écriture obtient toujours ce mannequin objet et vous devez les valider avant de les traiter. Nous ignorons les enregistrements fictifs dans le ItemWriter.
OriginalL'auteur SekharKari
et
StepBuilder
est:OriginalL'auteur Extreme