diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/FaultTolerantChunkOrientedTasklet.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/FaultTolerantChunkOrientedTasklet.java index f2602d07b..82e4f2712 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/FaultTolerantChunkOrientedTasklet.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/FaultTolerantChunkOrientedTasklet.java @@ -20,7 +20,7 @@ import java.util.Collections; import org.springframework.batch.core.SkipListener; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.step.skip.ItemSkipPolicy; -import org.springframework.batch.core.step.skip.SkipLimitExceededException; +import org.springframework.batch.core.step.skip.NonSkippableReadException; import org.springframework.batch.core.step.skip.SkipListenerFailedException; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; @@ -185,9 +185,7 @@ public class FaultTolerantChunkOrientedTasklet extends AbstractItemOriente logger.debug("Skipping failed input", e); } else { - // skip doesn't apply -> rethrow as if skip limit of zero - // was exceeded - throw new SkipLimitExceededException(0, e); + throw new NonSkippableReadException("Non-skippable exception during read", e); } } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SkipLimitStepFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SkipLimitStepFactoryBean.java index 5c8c7eca3..d654575c3 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SkipLimitStepFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SkipLimitStepFactoryBean.java @@ -8,6 +8,7 @@ import java.util.List; import org.springframework.batch.core.step.skip.ItemSkipPolicy; import org.springframework.batch.core.step.skip.LimitCheckingItemSkipPolicy; +import org.springframework.batch.core.step.skip.NonSkippableReadException; import org.springframework.batch.core.step.skip.SkipLimitExceededException; import org.springframework.batch.core.step.skip.SkipListenerFailedException; import org.springframework.batch.core.step.tasklet.TaskletStep; @@ -194,6 +195,7 @@ public class SkipLimitStepFactoryBean extends SimpleStepFactoryBean if (retryLimit > 0 || skipLimit > 0 || retryPolicy != null) { addFatalExceptionIfMissing(SkipLimitExceededException.class); + addFatalExceptionIfMissing(NonSkippableReadException.class); addFatalExceptionIfMissing(SkipListenerFailedException.class); addFatalExceptionIfMissing(RetryException.class); diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/skip/NonSkippableReadException.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/skip/NonSkippableReadException.java new file mode 100644 index 000000000..6a76ebdd5 --- /dev/null +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/skip/NonSkippableReadException.java @@ -0,0 +1,11 @@ +package org.springframework.batch.core.step.skip; + +import org.springframework.core.NestedRuntimeException; + +public class NonSkippableReadException extends NestedRuntimeException { + + public NonSkippableReadException(String msg, Throwable cause) { + super(msg, cause); + } + +}