Filter throwable by ExceptionTypeFilter.

Signed-off-by: Mengqi Xu <2663479778@qq.com>
This commit is contained in:
Mengqi Xu 2025-06-29 18:20:35 +08:00
parent ed86daa080
commit c9a099339f
2 changed files with 11 additions and 42 deletions

View File

@ -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<? extends Throwable> exclude : this.excludes) {
if (exclude.isInstance(throwable)) {
return false;
}
}
}
if (!this.includes.isEmpty()) {
boolean included = false;
for (Class<? extends Throwable> 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);
}
}

View File

@ -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<? extends Throwable> excludedType : this.excludes) {
if (excludedType.isInstance(throwable)) {
return false;
}
}
}
if (!this.includes.isEmpty()) {
boolean included = false;
for (Class<? extends Throwable> 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