Spring Batch sauter exception pour ItemWriter

Je suis en train d'utiliser Spring Batch 2.2.5 avec Java config. Voici la config que j'ai:

@Configuration
@EnableBatchProcessing
public class JobConfiguration {
    @Autowired
    private JobBuilderFactory jobBuilder;

    @Autowired
    private StepBuilderFactory stepBuilder;

    @Bean
    @Autowired
    public Job processDocumentsJob() {
        return jobBuilder.get("processDocumentsJob")
                .start(procesingStep())
                .build();
    }

    @Bean
    @Autowired
    public Step procesingStep() {
           CompositeItemProcessor<File, DocumentPackageFileMetadata> compositeProcessor = new CompositeItemProcessor<File, DocumentPackageFileMetadata>();
           compositeProcessor.setDelegates(Lists.newArrayList(
                   documentPackageFileValidationProcessor(),     
                   documentMetadataFileTransformer()
           ));
        return stepBuilder.get("procesingStep")
                .<File, DocumentPackageFileMetadata>chunk(1)
                .reader(documentPackageFileReader())
                .processor(compositeProcessor)
                .writer(documentMetadataFileMigrator())
                .faultTolerant()
                .skip(DocumentImportException.class)
                .skipLimit(10)
                .listener(stepExecutionListener())
                .build();
    }
....


}

Avec la config ci-dessus, si le itemwriter (la fève pointé par documentMetadataFileMigrator) renvoie 'DocumentImportException', alors, l'exception ne sera pas ignorée. Spring Batch sera effectivement réessayer la même entrée. c'est à dire qu'il va utiliser la même entrée contre "documentPackageFileValidationProcessor'.

Mais, si je déplace la logique à l'intérieur de la itemwriter dans un itemprocessor:

 @Bean
        @Autowired
        public Step procesingStep() {
               CompositeItemProcessor<File, DocumentPackageFileMetadata> compositeProcessor = new CompositeItemProcessor<File, DocumentPackageFileMetadata>();
               compositeProcessor.setDelegates(Lists.newArrayList(
                       documentPackageFileValidationProcessor(),     
                       documentMetadataFileTransformer(),
                       documentMetadataFileMigratorAsProcessor() //same as itemwriter, but implemented as itemprocessor
               ));
            return stepBuilder.get("procesingStep")
                    .<File, DocumentPackageFileMetadata>chunk(1)
                    .reader(documentPackageFileReader())
                    .processor(compositeProcessor)                    
                    .faultTolerant()
                    .skip(DocumentImportException.class)
                    .skipLimit(10)
                    .listener(stepExecutionListener())
                    .build();
        }

alors, l'exception sera ignoré correctement. c'est à dire Spring Batch ne sera pas réessayer la même élément contre 'documentPackageFileValidationProcessor'. Il va aller à l'élément suivant (celui retourné à partir de 'documentPackageFileReader').

Est-ce un bug sur Spring Batch, ou est-elle satisfaisante? Si oui, quelqu'un peut me pointer à la documentation pertinente?

Merci les gars, et excuses si cette question est fondamentale.

Cordialement,

Alex

OriginalL'auteur caffeine_inquisitor | 2014-03-20