Scheduled优化

This commit is contained in:
redkale
2023-12-07 15:08:19 +08:00
parent 42a1229f1f
commit 9f0a2b99b7
2 changed files with 31 additions and 7 deletions

View File

@@ -44,20 +44,32 @@ public @interface Scheduled {
String zone() default ""; String zone() default "";
/** /**
* 延迟时间,支持参数配置、乘法表达式和对象字段值 <br>
* ${env.fixedDelay}: 读取系统配置项
* 5*60: 乘法表达式值为30
* #delays: 读取对象的delays字段值作为值字段类型必须是long
* *
* @return deplay时间 * @return 延迟时间
*/ */
String fixedDelay() default "-1"; String fixedDelay() default "-1";
/** /**
* 周期时间,支持参数配置、乘法表达式和对象字段值 <br>
* ${env.fixedRate}: 读取系统配置项
* 5*60: 乘法表达式值为30
* #intervals: 读取对象的intervals字段值作为值字段类型必须是long
* *
* @return 周期时间 * @return 周期时间
*/ */
String fixedRate() default "-1"; String fixedRate() default "-1";
/** /**
* 起始延迟时间,支持参数配置、乘法表达式和对象字段值 <br>
* ${env.initialDelay}: 读取系统配置项
* 5*60: 乘法表达式值为30
* #inits: 读取对象的inits字段值作为值字段类型必须是long
* *
* @return 起始deplay时间 * @return 起始延迟时间
*/ */
String initialDelay() default "-1"; String initialDelay() default "-1";

View File

@@ -6,6 +6,7 @@ package org.redkale.scheduling;
import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.time.Duration; import java.time.Duration;
@@ -26,6 +27,7 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.redkale.annotation.Nullable; import org.redkale.annotation.Nullable;
import org.redkale.annotation.Scheduled; import org.redkale.annotation.Scheduled;
import org.redkale.source.SourceException;
import org.redkale.util.RedkaleClassLoader; import org.redkale.util.RedkaleClassLoader;
import org.redkale.util.RedkaleException; import org.redkale.util.RedkaleException;
import org.redkale.util.Utility; import org.redkale.util.Utility;
@@ -149,9 +151,9 @@ public class ScheduledFactory {
CronExpression cronExpr = CronExpression.parse(cron); CronExpression cronExpr = CronExpression.parse(cron);
return new CronTask(ref, name, method, cronExpr, zoneId); return new CronTask(ref, name, method, cronExpr, zoneId);
} else { } else {
long fixedDelayLong = getLongValue(fixedDelay); long fixedDelayLong = getLongValue(ref.get(), fixedDelay);
long fixedRateLong = getLongValue(fixedRate); long fixedRateLong = getLongValue(ref.get(), fixedRate);
long initialDelayLong = getLongValue(initialDelay); long initialDelayLong = getLongValue(ref.get(), initialDelay);
return new FixedTask(ref, name, method, fixedDelayLong, fixedRateLong, initialDelayLong, timeUnit); return new FixedTask(ref, name, method, fixedDelayLong, fixedRateLong, initialDelayLong, timeUnit);
} }
} }
@@ -188,7 +190,7 @@ public class ScheduledFactory {
} }
//支持5*60乘法表达式 //支持5*60乘法表达式
protected long getLongValue(String value) { protected long getLongValue(Object service, String value) {
if (value.indexOf('*') > -1) { if (value.indexOf('*') > -1) {
long rs = 1; long rs = 1;
boolean flag = false; boolean flag = false;
@@ -199,9 +201,19 @@ public class ScheduledFactory {
} }
} }
return flag ? rs : -1; 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() { public void destroy() {
if (scheduler != null) { if (scheduler != null) {