From 9f0a2b99b7978a76055cda887d16a8c404c38e71 Mon Sep 17 00:00:00 2001 From: redkale Date: Thu, 7 Dec 2023 15:08:19 +0800 Subject: [PATCH] =?UTF-8?q?Scheduled=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/redkale/annotation/Scheduled.java | 16 ++++++++++++-- .../redkale/scheduling/ScheduledFactory.java | 22 ++++++++++++++----- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/redkale/annotation/Scheduled.java b/src/main/java/org/redkale/annotation/Scheduled.java index b1395d298..218acee19 100644 --- a/src/main/java/org/redkale/annotation/Scheduled.java +++ b/src/main/java/org/redkale/annotation/Scheduled.java @@ -44,20 +44,32 @@ public @interface Scheduled { String zone() default ""; /** + * 延迟时间,支持参数配置、乘法表达式和对象字段值
+ * ${env.fixedDelay}: 读取系统配置项 + * 5*60: 乘法表达式,值为30 + * #delays: 读取对象的delays字段值作为值,字段类型必须是long * - * @return deplay时间 + * @return 延迟时间 */ String fixedDelay() default "-1"; /** + * 周期时间,支持参数配置、乘法表达式和对象字段值
+ * ${env.fixedRate}: 读取系统配置项 + * 5*60: 乘法表达式,值为30 + * #intervals: 读取对象的intervals字段值作为值,字段类型必须是long * * @return 周期时间 */ String fixedRate() default "-1"; /** + * 起始延迟时间,支持参数配置、乘法表达式和对象字段值
+ * ${env.initialDelay}: 读取系统配置项 + * 5*60: 乘法表达式,值为30 + * #inits: 读取对象的inits字段值作为值,字段类型必须是long * - * @return 起始deplay时间 + * @return 起始延迟时间 */ String initialDelay() default "-1"; diff --git a/src/main/java/org/redkale/scheduling/ScheduledFactory.java b/src/main/java/org/redkale/scheduling/ScheduledFactory.java index ee1480d20..41e8342e7 100644 --- a/src/main/java/org/redkale/scheduling/ScheduledFactory.java +++ b/src/main/java/org/redkale/scheduling/ScheduledFactory.java @@ -6,6 +6,7 @@ package org.redkale.scheduling; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.ref.WeakReference; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.time.Duration; @@ -26,6 +27,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.redkale.annotation.Nullable; import org.redkale.annotation.Scheduled; +import org.redkale.source.SourceException; import org.redkale.util.RedkaleClassLoader; import org.redkale.util.RedkaleException; import org.redkale.util.Utility; @@ -149,9 +151,9 @@ public class ScheduledFactory { CronExpression cronExpr = CronExpression.parse(cron); return new CronTask(ref, name, method, cronExpr, zoneId); } else { - long fixedDelayLong = getLongValue(fixedDelay); - long fixedRateLong = getLongValue(fixedRate); - long initialDelayLong = getLongValue(initialDelay); + long fixedDelayLong = getLongValue(ref.get(), fixedDelay); + long fixedRateLong = getLongValue(ref.get(), fixedRate); + long initialDelayLong = getLongValue(ref.get(), initialDelay); return new FixedTask(ref, name, method, fixedDelayLong, fixedRateLong, initialDelayLong, timeUnit); } } @@ -188,7 +190,7 @@ public class ScheduledFactory { } //支持5*60乘法表达式 - protected long getLongValue(String value) { + protected long getLongValue(Object service, String value) { if (value.indexOf('*') > -1) { long rs = 1; boolean flag = false; @@ -199,8 +201,18 @@ public class ScheduledFactory { } } return flag ? rs : -1; + } else if (value.indexOf('#') == 0) { + try { + String fieldName = value.substring(1); + Field field = service.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + return field.getLong(service); + } catch (Exception e) { + throw new SourceException(e); + } + } else { + return Long.parseLong(value); } - return Long.parseLong(value); } public void destroy() {