Spring Batch skip exception for ItemWriter
That behavior is correct. The ItemWriter receives a list of items to write. If a skippable exception is thrown, Spring Batch attempts to determine which item actually caused the exception so only that item is skipped. The way this is done is the transaction is rolled back, the commit interval is changed to 1, and each item is then reprocessed and the write is attempted again. This allows only the item with the error to be skipped instead of needing to skip the entire chunk.
This same issue is discussed here (only using XML config): How is the skipping implemented in Spring Batch?
At the end, this is what is working for me - if I want to use itemwriter, with no reprocessing of the same item:
@Bean
@Autowired
public Step procesingStep() {
CompositeItemProcessor<DocumentPackageFileMetadata, DocumentPackageFileMetadata> compositeProcessor = new CompositeItemProcessor<DocumentPackageFileMetadata, DocumentPackageFileMetadata>();
compositeProcessor.setDelegates(Lists.newArrayList(
documentPackageFileValidationProcessor(),
documentPackageFileExtractionProcessor(),
documentMetadataFileTransformer()
));
return stepBuilder.get("procesingStep")
.<DocumentPackageFileMetadata, DocumentPackageFileMetadata>chunk(1)
.reader(documentPackageFileReader())
.processor(compositeProcessor)
.writer(documentMetadataFileMigrator())
.faultTolerant()
.skip(DocumentImportException.class)
.noRetry(DocumentImportException.class)
.noRollback(DocumentImportException.class)
.skipLimit(10)
.listener(skipListener())
.listener(documentPackageReadyForProcessingListener())
.listener(stepExecutionListener())
.build();
}
Note that I have specified 'noRetry' and 'noRollback'.