!1316 重试工具新增获取异常原因等相关方法

Merge pull request !1316 from Toint/v6-dev
This commit is contained in:
Looly 2025-03-04 01:09:06 +00:00 committed by Gitee
commit 76bac0e6a4
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
2 changed files with 27 additions and 4 deletions

View File

@ -39,7 +39,7 @@ public class RetryUtil {
* @param run 执行方法
* @param maxAttempts 最大的重试次数
* @param delay 重试间隔
* @param recover 达到最大重试次数后执行的备用方法入参是重试过程中的异常
* @param recover 达到最大重试次数后执行的备用方法
* @param exs 指定的异常类型需要重试
*/
public static void ofException(final Runnable run, final long maxAttempts, final Duration delay,
@ -65,7 +65,7 @@ public class RetryUtil {
* @param sup 执行方法
* @param maxAttempts 最大的重试次数
* @param delay 重试间隔
* @param recover 达到最大重试次数后执行的备用方法入参是重试过程中的异常
* @param recover 达到最大重试次数后执行的备用方法
* @param exs 指定的异常类型需要重试
* @param <T> 结果类型
* @return 执行结果
@ -90,7 +90,7 @@ public class RetryUtil {
* @param run 执行方法
* @param maxAttempts 最大的重试次数
* @param delay 重试间隔
* @param recover 达到最大重试次数后执行的备用方法入参是重试过程中的异常
* @param recover 达到最大重试次数后执行的备用方法
* @param predicate 自定义重试条件
*/
public static void ofPredicate(final Runnable run, final long maxAttempts, final Duration delay,
@ -111,7 +111,7 @@ public class RetryUtil {
* @param sup 执行方法
* @param maxAttempts 最大的重试次数
* @param delay 重试间隔
* @param recover 达到最大重试次数后执行的备用方法入参是重试过程中的异常
* @param recover 达到最大重试次数后执行的备用方法
* @param predicate 自定义重试条件
* @param <T> 结果类型
* @return 执行结果

View File

@ -124,6 +124,10 @@ public class RetryableTask<T> {
* 重试间隔默认1秒
*/
private Duration delay = Duration.ofSeconds(1);
/**
* 异常信息
*/
private Throwable throwable;
/**
* 构造方法内部使用调用请使用请用ofXXX
@ -174,6 +178,24 @@ public class RetryableTask<T> {
return Optional.ofNullable(this.result);
}
/**
* 获取结果, 如果无法获取结果, 则抛出最后一次执行时的异常
*
* @return 结果
*/
public T orElseThrow() throws Throwable {
return Optional.ofNullable(this.result).orElseThrow(() -> this.throwable().orElse(new RuntimeException()));
}
/**
* 获取异常
*
* @return 返回包装了异常的 {@link Optional}对象
*/
public Optional<Throwable> throwable() {
return Optional.ofNullable(this.throwable);
}
/**
* 异步执行重试方法
*
@ -216,6 +238,7 @@ public class RetryableTask<T> {
ThreadUtil.sleep(delay.toMillis());
}
this.throwable = th;
return this;
}