From b9cedd87989a9f5fbde6f75f538a163704344a84 Mon Sep 17 00:00:00 2001 From: Toint <599818663@qq.com> Date: Sun, 18 May 2025 19:25:41 +0800 Subject: [PATCH 1/2] =?UTF-8?q?RetryableTask:=20=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E6=9C=80=E5=90=8E=E4=B8=80=E6=AC=A1=E4=BB=BB=E5=8A=A1=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E6=97=B6=E7=9A=84=E7=BA=BF=E7=A8=8B=E7=9D=A1=E7=9C=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/hutool/core/thread/RetryableTask.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/thread/RetryableTask.java b/hutool-core/src/main/java/org/dromara/hutool/core/thread/RetryableTask.java index 2189cf5d5..e79d7dd68 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/thread/RetryableTask.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/thread/RetryableTask.java @@ -236,7 +236,10 @@ public class RetryableTask { break; } - ThreadUtil.sleep(delay.toMillis()); + // 避免最后一次任务执行时的线程睡眠 + if (this.maxAttempts > 0) { + ThreadUtil.sleep(delay.toMillis()); + } } this.throwable = th; From 9f76238137c5b9718638871b7e2252f1d72aba43 Mon Sep 17 00:00:00 2001 From: Toint <599818663@qq.com> Date: Sun, 18 May 2025 20:21:32 +0800 Subject: [PATCH 2/2] =?UTF-8?q?RetryableTask:=20=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=87=B3=E5=B0=91=E8=A2=AB=E6=89=A7=E8=A1=8C=E4=B8=80=E6=AC=A1?= =?UTF-8?q?,=20=E6=89=8D=E4=BC=9A=E8=BF=9B=E5=85=A5=E9=87=8D=E8=AF=95,=20?= =?UTF-8?q?=E6=9B=B4=E7=AC=A6=E5=90=88=E9=87=8D=E8=AF=95=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=9A=84=E8=AF=AD=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/hutool/core/thread/RetryUtil.java | 14 +++++++------- .../dromara/hutool/core/thread/RetryableTask.java | 11 +++++------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/thread/RetryUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/thread/RetryUtil.java index 60c9a2bc8..0371858d6 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/thread/RetryUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/thread/RetryUtil.java @@ -37,7 +37,7 @@ public class RetryUtil { * 没有返回值,重试执行方法 * * @param run 执行方法 - * @param maxAttempts 最大的重试次数 + * @param maxAttempts 最大的重试次数, 小于1不会重试, 但任务至少会被执行1次 * @param delay 重试间隔 * @param recover 达到最大重试次数后执行的备用方法 * @param exs 指定的异常类型需要重试 @@ -63,7 +63,7 @@ public class RetryUtil { * 有返回值,重试执行方法 * * @param sup 执行方法 - * @param maxAttempts 最大的重试次数 + * @param maxAttempts 最大的重试次数, 小于1不会重试, 但任务至少会被执行1次 * @param delay 重试间隔 * @param recover 达到最大重试次数后执行的备用方法 * @param exs 指定的异常类型需要重试 @@ -88,10 +88,10 @@ public class RetryUtil { * 没有返回值,重试执行方法 * * @param run 执行方法 - * @param maxAttempts 最大的重试次数 + * @param maxAttempts 最大的重试次数, 小于1不会重试, 但任务至少会被执行1次 * @param delay 重试间隔 * @param recover 达到最大重试次数后执行的备用方法 - * @param predicate 自定义重试条件 + * @param predicate 自定义重试条件, 返回true时表示重试 */ public static void ofPredicate(final Runnable run, final long maxAttempts, final Duration delay, final Supplier recover, final BiPredicate predicate) { @@ -105,14 +105,14 @@ public class RetryUtil { /** - * 根据异常信息进行重试 + * 根据自定义结果进行重试 * 有返回值,重试执行方法 * * @param sup 执行方法 - * @param maxAttempts 最大的重试次数 + * @param maxAttempts 最大的重试次数, 小于1不会重试, 但任务至少会被执行1次 * @param delay 重试间隔 * @param recover 达到最大重试次数后执行的备用方法 - * @param predicate 自定义重试条件 + * @param predicate 自定义重试条件, 返回true时表示重试 * @param 结果类型 * @return 执行结果 */ diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/thread/RetryableTask.java b/hutool-core/src/main/java/org/dromara/hutool/core/thread/RetryableTask.java index e79d7dd68..87eaf9d59 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/thread/RetryableTask.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/thread/RetryableTask.java @@ -109,11 +109,11 @@ public class RetryableTask { */ private T result; /** - * 执行法方法 + * 执行方法 */ private final Supplier sup; /** - * 重试策略 + * 重试策略, 返回true时表示重试 */ private final BiPredicate predicate; /** @@ -150,8 +150,6 @@ public class RetryableTask { * @return 当前对象 */ public RetryableTask maxAttempts(final long maxAttempts) { - Assert.isTrue(this.maxAttempts > 0, "maxAttempts must be greater than 0"); - this.maxAttempts = maxAttempts; return this; } @@ -223,7 +221,8 @@ public class RetryableTask { private RetryableTask doExecute() { Throwable th = null; - while (--this.maxAttempts >= 0) { + // 任务至少被执行一次 + do { try { this.result = this.sup.get(); } catch (final Throwable t) { @@ -240,7 +239,7 @@ public class RetryableTask { if (this.maxAttempts > 0) { ThreadUtil.sleep(delay.toMillis()); } - } + } while (--this.maxAttempts >= 0); this.throwable = th; return this;