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