From 4bd297691eecb3e2d56967db8cf7ff5d2eb3a748 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Fri, 25 Mar 2011 12:44:25 +0000 Subject: [PATCH] Prevent infinite loop if retry policy fails --- .../retry/support/RetryTemplate.java | 6 ++++- .../retry/support/RetryTemplateTests.java | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/retry/support/RetryTemplate.java b/src/main/java/org/springframework/retry/support/RetryTemplate.java index f191c9c..e4c04f0 100644 --- a/src/main/java/org/springframework/retry/support/RetryTemplate.java +++ b/src/main/java/org/springframework/retry/support/RetryTemplate.java @@ -244,7 +244,11 @@ public class RetryTemplate implements RetryOperations { doOnErrorInterceptors(retryCallback, context, e); - registerThrowable(retryPolicy, state, context, e); + try { + registerThrowable(retryPolicy, state, context, e); + } catch (Exception ex) { + throw new TerminatedRetryException("Could not register throwable", ex); + } if (canRetry(retryPolicy, context) && !context.isExhaustedOnly()) { try { diff --git a/src/test/java/org/springframework/retry/support/RetryTemplateTests.java b/src/test/java/org/springframework/retry/support/RetryTemplateTests.java index 5d691b0..9ad9463 100644 --- a/src/test/java/org/springframework/retry/support/RetryTemplateTests.java +++ b/src/test/java/org/springframework/retry/support/RetryTemplateTests.java @@ -35,6 +35,7 @@ import org.springframework.retry.ExhaustedRetryException; import org.springframework.retry.RecoveryCallback; import org.springframework.retry.RetryCallback; import org.springframework.retry.RetryContext; +import org.springframework.retry.TerminatedRetryException; import org.springframework.retry.backoff.BackOffContext; import org.springframework.retry.backoff.BackOffInterruptedException; import org.springframework.retry.backoff.BackOffPolicy; @@ -246,6 +247,28 @@ public class RetryTemplateTests { } } + @Test + public void testFailedPolicy() throws Exception { + RetryTemplate retryTemplate = new RetryTemplate(); + retryTemplate.setRetryPolicy(new NeverRetryPolicy() { + @Override + public void registerThrowable(RetryContext context, Throwable throwable) { + throw new RuntimeException("Planned"); + } + }); + try { + retryTemplate.execute(new RetryCallback() { + public Object doWithRetry(RetryContext context) throws Exception { + throw new RuntimeException("Realllly bad!"); + } + }); + fail("Expected Error"); + } + catch (TerminatedRetryException e) { + assertEquals("Planned", e.getCause().getMessage()); + } + } + @Test public void testBackOffInterrupted() throws Exception { RetryTemplate retryTemplate = new RetryTemplate();