diff --git a/spring-aop/src/main/java/org/springframework/aop/retry/MethodRetrySpec.java b/spring-aop/src/main/java/org/springframework/aop/retry/MethodRetrySpec.java index 6d9e499d21..0c432580bc 100644 --- a/spring-aop/src/main/java/org/springframework/aop/retry/MethodRetrySpec.java +++ b/spring-aop/src/main/java/org/springframework/aop/retry/MethodRetrySpec.java @@ -20,6 +20,8 @@ import java.time.Duration; import java.util.Collection; import java.util.Collections; +import org.springframework.util.ExceptionTypeFilter; + /** * A specification for retry attempts on a given method, combining common * retry characteristics. This roughly matches the annotation attributes @@ -62,28 +64,9 @@ public record MethodRetrySpec( MethodRetryPredicate combinedPredicate() { - return (method, throwable) -> { - if (!this.excludes.isEmpty()) { - for (Class exclude : this.excludes) { - if (exclude.isInstance(throwable)) { - return false; - } - } - } - if (!this.includes.isEmpty()) { - boolean included = false; - for (Class include : this.includes) { - if (include.isInstance(throwable)) { - included = true; - break; - } - } - if (!included) { - return false; - } - } - return this.predicate.shouldRetry(method, throwable); - }; + return (method, throwable) -> new ExceptionTypeFilter(this.includes, this.excludes, true) + .match(throwable.getClass()) && + this.predicate.shouldRetry(method, throwable); } } diff --git a/spring-core/src/main/java/org/springframework/core/retry/DefaultRetryPolicy.java b/spring-core/src/main/java/org/springframework/core/retry/DefaultRetryPolicy.java index 7c697af0aa..7ebf356dfc 100644 --- a/spring-core/src/main/java/org/springframework/core/retry/DefaultRetryPolicy.java +++ b/spring-core/src/main/java/org/springframework/core/retry/DefaultRetryPolicy.java @@ -22,6 +22,7 @@ import java.util.function.Predicate; import org.jspecify.annotations.Nullable; +import org.springframework.util.ExceptionTypeFilter; import org.springframework.util.backoff.BackOff; /** @@ -29,6 +30,7 @@ import org.springframework.util.backoff.BackOff; * * @author Sam Brannen * @author Mahmoud Ben Hassine + * @author Mengqi Xu * @since 7.0 */ class DefaultRetryPolicy implements RetryPolicy { @@ -55,26 +57,10 @@ class DefaultRetryPolicy implements RetryPolicy { @Override public boolean shouldRetry(Throwable throwable) { - if (!this.excludes.isEmpty()) { - for (Class excludedType : this.excludes) { - if (excludedType.isInstance(throwable)) { - return false; - } - } - } - if (!this.includes.isEmpty()) { - boolean included = false; - for (Class includedType : this.includes) { - if (includedType.isInstance(throwable)) { - included = true; - break; - } - } - if (!included) { - return false; - } - } - return this.predicate == null || this.predicate.test(throwable); + ExceptionTypeFilter exceptionTypeFilter = new ExceptionTypeFilter(this.includes, + this.excludes, true); + return exceptionTypeFilter.match(throwable.getClass()) && + (this.predicate == null || this.predicate.test(throwable)); } @Override