From a96c8060b20eb3d4b21f21a3f98095f9f54b8f47 Mon Sep 17 00:00:00 2001 From: robokaso Date: Fri, 16 Jan 2009 10:17:49 +0000 Subject: [PATCH] REOPENED - BATCH-995: unclear retry configuration in FaultTolerantStepFactoryBean wrap the injected retry policy so that fatal exceptions are handled properly --- .../item/FaultTolerantStepFactoryBean.java | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBean.java index 362bf61f9..5802f8375 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBean.java @@ -37,7 +37,9 @@ import org.springframework.batch.retry.RetryException; import org.springframework.batch.retry.RetryListener; import org.springframework.batch.retry.RetryPolicy; import org.springframework.batch.retry.backoff.BackOffPolicy; +import org.springframework.batch.retry.policy.ExceptionClassifierRetryPolicy; import org.springframework.batch.retry.policy.MapRetryContextCache; +import org.springframework.batch.retry.policy.NeverRetryPolicy; import org.springframework.batch.retry.policy.RetryContextCache; import org.springframework.batch.retry.policy.SimpleRetryPolicy; import org.springframework.batch.support.Classifier; @@ -223,25 +225,41 @@ public class FaultTolerantStepFactoryBean extends SimpleStepFactoryBean() { + + public RetryPolicy classify(Throwable classifiable) { + + for (Class fatal : fatalExceptionClasses) { + if (fatal.isAssignableFrom(classifiable.getClass())) { + return neverRetryPolicy; + } + } + return retryPolicy; + } + }); BatchRetryTemplate batchRetryTemplate = new BatchRetryTemplate(); if (backOffPolicy != null) { batchRetryTemplate.setBackOffPolicy(backOffPolicy); } - batchRetryTemplate.setRetryPolicy(retryPolicy); + batchRetryTemplate.setRetryPolicy(retryPolicyWrapper); // Co-ordinate the retry policy with the exception handler: RepeatOperations stepOperations = getStepOperations(); if (stepOperations instanceof RepeatTemplate) { - SimpleRetryExceptionHandler exceptionHandler = new SimpleRetryExceptionHandler(retryPolicy, + SimpleRetryExceptionHandler exceptionHandler = new SimpleRetryExceptionHandler(retryPolicyWrapper, getExceptionHandler(), fatalExceptionClasses); ((RepeatTemplate) stepOperations).setExceptionHandler(exceptionHandler); }