diff --git a/src/main/java/org/redkale/cache/Cached.java b/src/main/java/org/redkale/cache/Cached.java index 223be9369..52e103ae3 100644 --- a/src/main/java/org/redkale/cache/Cached.java +++ b/src/main/java/org/redkale/cache/Cached.java @@ -10,6 +10,7 @@ import java.lang.annotation.Retention; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Target; import java.util.concurrent.TimeUnit; +import org.redkale.service.LoadMode; /** * //TODO 待实现 @@ -80,4 +81,10 @@ public @interface Cached { */ boolean nullable() default false; + /** + * Service加载模式 + * + * @return 模式 + */ + LoadMode mode() default LoadMode.ANY; } diff --git a/src/main/java/org/redkale/cache/spi/CacheAsmMethodBoost.java b/src/main/java/org/redkale/cache/spi/CacheAsmMethodBoost.java index 0bca289ab..5fbbb92d8 100644 --- a/src/main/java/org/redkale/cache/spi/CacheAsmMethodBoost.java +++ b/src/main/java/org/redkale/cache/spi/CacheAsmMethodBoost.java @@ -25,6 +25,7 @@ import static org.redkale.asm.Opcodes.*; import org.redkale.asm.Type; import org.redkale.cache.Cached; import org.redkale.inject.ResourceFactory; +import org.redkale.service.LoadMode; import org.redkale.util.RedkaleClassLoader; import org.redkale.util.RedkaleException; import org.redkale.util.ThrowSupplier; @@ -64,6 +65,9 @@ public class CacheAsmMethodBoost extends AsmMethodBoost { if (cached == null) { return newMethodName; } + if (!LoadMode.matches(remote, cached.mode())) { + return newMethodName; + } if (method.getAnnotation(DynForCache.class) != null) { return newMethodName; } diff --git a/src/main/java/org/redkale/cache/spi/DynForCache.java b/src/main/java/org/redkale/cache/spi/DynForCache.java index 305a17fbb..6281ba0c4 100644 --- a/src/main/java/org/redkale/cache/spi/DynForCache.java +++ b/src/main/java/org/redkale/cache/spi/DynForCache.java @@ -10,6 +10,7 @@ import java.lang.annotation.Retention; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Target; import java.util.concurrent.TimeUnit; +import org.redkale.service.LoadMode; /** * {@link org.redkale.cache.Cached}注解的动态扩展版,会多一个字段信息 @@ -38,4 +39,6 @@ public @interface DynForCache { TimeUnit timeUnit(); boolean nullable(); + + LoadMode mode() default LoadMode.ANY; } diff --git a/src/main/java/org/redkale/lock/Locked.java b/src/main/java/org/redkale/lock/Locked.java index 564c4b578..d9d558911 100644 --- a/src/main/java/org/redkale/lock/Locked.java +++ b/src/main/java/org/redkale/lock/Locked.java @@ -9,6 +9,7 @@ import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Target; +import org.redkale.service.LoadMode; /** * //TODO 待实现 @@ -31,4 +32,10 @@ import java.lang.annotation.Target; @Retention(RUNTIME) public @interface Locked { + /** + * Service加载模式 + * + * @return 模式 + */ + LoadMode mode() default LoadMode.ANY; } diff --git a/src/main/java/org/redkale/lock/spi/LockAsmMethodBoost.java b/src/main/java/org/redkale/lock/spi/LockAsmMethodBoost.java index ff06ea2e1..2e98f6d3a 100644 --- a/src/main/java/org/redkale/lock/spi/LockAsmMethodBoost.java +++ b/src/main/java/org/redkale/lock/spi/LockAsmMethodBoost.java @@ -18,6 +18,7 @@ import static org.redkale.asm.Opcodes.*; import org.redkale.asm.Type; import org.redkale.inject.ResourceFactory; import org.redkale.lock.Locked; +import org.redkale.service.LoadMode; import org.redkale.util.RedkaleException; /** @@ -44,6 +45,9 @@ public class LockAsmMethodBoost extends AsmMethodBoost { if (locked == null) { return newMethodName; } + if (!LoadMode.matches(remote, locked.mode())) { + return newMethodName; + } if (method.getAnnotation(DynForLock.class) != null) { return newMethodName; } diff --git a/src/main/java/org/redkale/mq/Messaged.java b/src/main/java/org/redkale/mq/Messaged.java index a23b9367e..d981ed08d 100644 --- a/src/main/java/org/redkale/mq/Messaged.java +++ b/src/main/java/org/redkale/mq/Messaged.java @@ -9,6 +9,7 @@ import java.lang.annotation.Retention; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Target; import org.redkale.convert.ConvertType; +import org.redkale.service.LoadMode; /** * MQ资源注解, 只能标记在Service类方法上 @@ -34,4 +35,11 @@ public @interface Messaged { String[] topics(); ConvertType convertType() default ConvertType.JSON; + + /** + * Service加载模式 + * + * @return 模式 + */ + LoadMode mode() default LoadMode.LOCAL; } diff --git a/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java b/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java index 00ac96350..f4a2f0513 100644 --- a/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java +++ b/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java @@ -47,6 +47,7 @@ import org.redkale.mq.MessageConext; import org.redkale.mq.MessageConsumer; import org.redkale.mq.Messaged; import org.redkale.mq.ResourceConsumer; +import org.redkale.service.LoadMode; import org.redkale.util.RedkaleClassLoader; import org.redkale.util.RedkaleException; import org.redkale.util.TypeToken; @@ -90,6 +91,9 @@ public class MessageAsmMethodBoost extends AsmMethodBoost { if (messaged == null) { return newMethodName; } + if (!LoadMode.matches(remote, messaged.mode())) { + return newMethodName; + } if (Modifier.isFinal(method.getModifiers()) || Modifier.isStatic(method.getModifiers())) { throw new RedkaleException("@" + Messaged.class.getSimpleName() + " cannot on final or static method, but on " + method); } diff --git a/src/main/java/org/redkale/schedule/Scheduled.java b/src/main/java/org/redkale/schedule/Scheduled.java index 9e9d72d8b..f8250dd52 100644 --- a/src/main/java/org/redkale/schedule/Scheduled.java +++ b/src/main/java/org/redkale/schedule/Scheduled.java @@ -5,6 +5,7 @@ package org.redkale.schedule; import java.lang.annotation.*; import java.util.concurrent.TimeUnit; +import org.redkale.service.LoadMode; /** * 定时任务标记,只能作用于Service的无参数或者单一ScheduleEvent参数的方法上, 功能类似Spring里的Scheduled注解 @@ -52,7 +53,7 @@ public @interface Scheduled { * 5*60: 乘法表达式,值为30 * ${env.scheduling.fixedDelay}: 读取系统配置项 * #delays: 读取宿主对象的delays字段值作为值,字段类型必须是int、long数值类型 - * + * * 值大于0且fixedRate小于0则使用 ScheduledThreadPoolExecutor.scheduleWithFixedDelay * * @return 延迟时间 @@ -66,7 +67,7 @@ public @interface Scheduled { * 5*60: 乘法表达式,值为30 * ${env.scheduling.fixedRate}: 读取系统配置项 * #intervals: 读取宿主对象的intervals字段值作为值,字段类型必须是int、long数值类型 - * + * * 值大于0则使用 ScheduledThreadPoolExecutor.scheduleAtFixedRate * * @return 周期时间 @@ -80,8 +81,9 @@ public @interface Scheduled { * 5*60: 乘法表达式,值为30 * ${env.scheduling.initialDelay}: 读取系统配置项 * #inits: 读取宿主对象的inits字段值作为值,字段类型必须是int、long数值类型 - * + * * 值大于0且fixedRate和fixedDelay小于0则使用 ScheduledThreadPoolExecutor.schedule + * * @return 起始延迟时间 */ String initialDelay() default "-1"; @@ -100,4 +102,10 @@ public @interface Scheduled { */ String comment() default ""; + /** + * Service加载模式 + * + * @return 模式 + */ + LoadMode mode() default LoadMode.LOCAL; } diff --git a/src/main/java/org/redkale/schedule/spi/ScheduleManagerService.java b/src/main/java/org/redkale/schedule/spi/ScheduleManagerService.java index 1b2253e90..e40a89f11 100644 --- a/src/main/java/org/redkale/schedule/spi/ScheduleManagerService.java +++ b/src/main/java/org/redkale/schedule/spi/ScheduleManagerService.java @@ -34,9 +34,11 @@ import org.redkale.annotation.Nullable; import org.redkale.annotation.Resource; import org.redkale.annotation.ResourceType; import org.redkale.boot.Application; +import org.redkale.net.sncp.Sncp; import org.redkale.schedule.ScheduleEvent; import org.redkale.schedule.ScheduleManager; import org.redkale.schedule.Scheduled; +import org.redkale.service.LoadMode; import org.redkale.service.Local; import org.redkale.service.Service; import org.redkale.util.AnyValue; @@ -123,6 +125,7 @@ public class ScheduleManagerService implements ScheduleManager, Service { public boolean schedule(Object service) { lock.lock(); try { + boolean remoteMode = service instanceof Service && Sncp.isRemote((Service) service); for (WeakReference item : refTaskMap.keySet()) { if (item.get() == service) { logger.log(Level.WARNING, service + " repeat schedule"); @@ -150,7 +153,7 @@ public class ScheduleManagerService implements ScheduleManager, Service { throw new RedkaleException("@" + Scheduled.class.getSimpleName() + " must be on non-parameter or " + ScheduleEvent.class.getSimpleName() + "-parameter method, but on " + method); } - ScheduledTask task = schedule(ref, method, taskCount); + ScheduledTask task = schedule(ref, method, remoteMode, taskCount); //时间没配置: task=null if (task != null) { tasks.put(method.getName(), task); @@ -186,8 +189,11 @@ public class ScheduleManagerService implements ScheduleManager, Service { } } - protected ScheduledTask schedule(WeakReference ref, Method method, AtomicInteger taskCount) { + protected ScheduledTask schedule(WeakReference ref, Method method, boolean remoteMode, AtomicInteger taskCount) { Scheduled ann = method.getAnnotation(Scheduled.class); + if (!LoadMode.matches(remoteMode, ann.mode())) { + return null; + } String name = getProperty(ann.name()); String cron = getProperty(ann.cron()); String fixedDelay = getProperty(ann.fixedDelay()); diff --git a/src/main/java/org/redkale/service/LoadMode.java b/src/main/java/org/redkale/service/LoadMode.java new file mode 100644 index 000000000..c5b51ce1d --- /dev/null +++ b/src/main/java/org/redkale/service/LoadMode.java @@ -0,0 +1,58 @@ +/* + * + */ +package org.redkale.service; + +/** + * Service加载模式 + * + * + *
+ * 详情见: https://redkale.org + * + * @author zhangjx + * + * @since 2.8.0 + */ +public enum LoadMode { + /** + * 本地模式 + */ + LOCAL, + /** + * 远程模式 + */ + REMOTE, + /** + * 任意模式 + */ + ANY; + + /** + * 是否匹配当前模式 + * + * @param mode 模式 + * + * @return 是否匹配 + */ + public boolean matches(LoadMode mode) { + return this == mode || this == ANY; + } + + /** + * 是否匹配当前模式 + * + * @param remote 是否远程 + * @param mode 模式 + * + * @return 是否匹配 + */ + public static boolean matches(boolean remote, LoadMode mode) { + if (remote && mode == LoadMode.LOCAL) { //只容许本地模式 + return false; + } else if (!remote && mode == LoadMode.REMOTE) { //只容许远程模式 + return false; + } + return true; + } +}