diff --git a/spring-core/src/main/java/org/springframework/core/retry/RetryTemplate.java b/spring-core/src/main/java/org/springframework/core/retry/RetryTemplate.java index 9d374d5e467..f7d9aad5cb5 100644 --- a/spring-core/src/main/java/org/springframework/core/retry/RetryTemplate.java +++ b/spring-core/src/main/java/org/springframework/core/retry/RetryTemplate.java @@ -164,7 +164,7 @@ public class RetryTemplate implements RetryOperations { } catch (InterruptedException interruptedException) { Thread.currentThread().interrupt(); - RetryException retryException = new RetryException( + RetryException retryException = new RetryInterruptedException( "Unable to back off for retryable operation '%s'".formatted(retryableName), interruptedException); exceptions.forEach(retryException::addSuppressed); @@ -200,4 +200,20 @@ public class RetryTemplate implements RetryOperations { } } + private static class RetryInterruptedException extends RetryException { + + private static final long serialVersionUID = 1L; + + + RetryInterruptedException(String message, InterruptedException cause) { + super(message, cause); + } + + @Override + public int getRetryCount() { + return (getSuppressed().length - 1); + } + + } + } diff --git a/spring-core/src/test/java/org/springframework/core/retry/RetryTemplateTests.java b/spring-core/src/test/java/org/springframework/core/retry/RetryTemplateTests.java index 8e8bbaa2fcf..42a92dea3ab 100644 --- a/spring-core/src/test/java/org/springframework/core/retry/RetryTemplateTests.java +++ b/spring-core/src/test/java/org/springframework/core/retry/RetryTemplateTests.java @@ -238,9 +238,7 @@ class RetryTemplateTests { .withMessageMatching("Unable to back off for retryable operation '.+?'") .withCause(interruptedException) .satisfies(throwable -> assertThat(throwable.getSuppressed()).containsExactly(exception)) - // TODO Fix retry count for InterruptedException scenario. - // Retry count should actually be 0. - .satisfies(throwable -> assertThat(throwable.getRetryCount()).isEqualTo(1)) + .satisfies(throwable -> assertThat(throwable.getRetryCount()).isZero()) .satisfies(throwable -> inOrder.verify(retryListener).onRetryPolicyInterruption(retryPolicy, retryable, throwable)); verifyNoMoreInteractions(retryListener);