增加LoadMode功能

This commit is contained in:
redkale
2023-12-26 09:24:58 +08:00
parent 6db029263c
commit c57a32143b
10 changed files with 114 additions and 5 deletions

View File

@@ -10,6 +10,7 @@ import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME; import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.redkale.service.LoadMode;
/** /**
* //TODO 待实现 * //TODO 待实现
@@ -80,4 +81,10 @@ public @interface Cached {
*/ */
boolean nullable() default false; boolean nullable() default false;
/**
* Service加载模式
*
* @return 模式
*/
LoadMode mode() default LoadMode.ANY;
} }

View File

@@ -25,6 +25,7 @@ import static org.redkale.asm.Opcodes.*;
import org.redkale.asm.Type; import org.redkale.asm.Type;
import org.redkale.cache.Cached; import org.redkale.cache.Cached;
import org.redkale.inject.ResourceFactory; import org.redkale.inject.ResourceFactory;
import org.redkale.service.LoadMode;
import org.redkale.util.RedkaleClassLoader; import org.redkale.util.RedkaleClassLoader;
import org.redkale.util.RedkaleException; import org.redkale.util.RedkaleException;
import org.redkale.util.ThrowSupplier; import org.redkale.util.ThrowSupplier;
@@ -64,6 +65,9 @@ public class CacheAsmMethodBoost extends AsmMethodBoost {
if (cached == null) { if (cached == null) {
return newMethodName; return newMethodName;
} }
if (!LoadMode.matches(remote, cached.mode())) {
return newMethodName;
}
if (method.getAnnotation(DynForCache.class) != null) { if (method.getAnnotation(DynForCache.class) != null) {
return newMethodName; return newMethodName;
} }

View File

@@ -10,6 +10,7 @@ import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME; import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.redkale.service.LoadMode;
/** /**
* {@link org.redkale.cache.Cached}注解的动态扩展版,会多一个字段信息 * {@link org.redkale.cache.Cached}注解的动态扩展版,会多一个字段信息
@@ -38,4 +39,6 @@ public @interface DynForCache {
TimeUnit timeUnit(); TimeUnit timeUnit();
boolean nullable(); boolean nullable();
LoadMode mode() default LoadMode.ANY;
} }

View File

@@ -9,6 +9,7 @@ import java.lang.annotation.Inherited;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME; import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import org.redkale.service.LoadMode;
/** /**
* //TODO 待实现 * //TODO 待实现
@@ -31,4 +32,10 @@ import java.lang.annotation.Target;
@Retention(RUNTIME) @Retention(RUNTIME)
public @interface Locked { public @interface Locked {
/**
* Service加载模式
*
* @return 模式
*/
LoadMode mode() default LoadMode.ANY;
} }

View File

@@ -18,6 +18,7 @@ import static org.redkale.asm.Opcodes.*;
import org.redkale.asm.Type; import org.redkale.asm.Type;
import org.redkale.inject.ResourceFactory; import org.redkale.inject.ResourceFactory;
import org.redkale.lock.Locked; import org.redkale.lock.Locked;
import org.redkale.service.LoadMode;
import org.redkale.util.RedkaleException; import org.redkale.util.RedkaleException;
/** /**
@@ -44,6 +45,9 @@ public class LockAsmMethodBoost extends AsmMethodBoost {
if (locked == null) { if (locked == null) {
return newMethodName; return newMethodName;
} }
if (!LoadMode.matches(remote, locked.mode())) {
return newMethodName;
}
if (method.getAnnotation(DynForLock.class) != null) { if (method.getAnnotation(DynForLock.class) != null) {
return newMethodName; return newMethodName;
} }

View File

@@ -9,6 +9,7 @@ import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME; import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import org.redkale.convert.ConvertType; import org.redkale.convert.ConvertType;
import org.redkale.service.LoadMode;
/** /**
* MQ资源注解, 只能标记在Service类方法上 * MQ资源注解, 只能标记在Service类方法上
@@ -34,4 +35,11 @@ public @interface Messaged {
String[] topics(); String[] topics();
ConvertType convertType() default ConvertType.JSON; ConvertType convertType() default ConvertType.JSON;
/**
* Service加载模式
*
* @return 模式
*/
LoadMode mode() default LoadMode.LOCAL;
} }

View File

@@ -47,6 +47,7 @@ import org.redkale.mq.MessageConext;
import org.redkale.mq.MessageConsumer; import org.redkale.mq.MessageConsumer;
import org.redkale.mq.Messaged; import org.redkale.mq.Messaged;
import org.redkale.mq.ResourceConsumer; import org.redkale.mq.ResourceConsumer;
import org.redkale.service.LoadMode;
import org.redkale.util.RedkaleClassLoader; import org.redkale.util.RedkaleClassLoader;
import org.redkale.util.RedkaleException; import org.redkale.util.RedkaleException;
import org.redkale.util.TypeToken; import org.redkale.util.TypeToken;
@@ -90,6 +91,9 @@ public class MessageAsmMethodBoost extends AsmMethodBoost {
if (messaged == null) { if (messaged == null) {
return newMethodName; return newMethodName;
} }
if (!LoadMode.matches(remote, messaged.mode())) {
return newMethodName;
}
if (Modifier.isFinal(method.getModifiers()) || Modifier.isStatic(method.getModifiers())) { if (Modifier.isFinal(method.getModifiers()) || Modifier.isStatic(method.getModifiers())) {
throw new RedkaleException("@" + Messaged.class.getSimpleName() + " cannot on final or static method, but on " + method); throw new RedkaleException("@" + Messaged.class.getSimpleName() + " cannot on final or static method, but on " + method);
} }

View File

@@ -5,6 +5,7 @@ package org.redkale.schedule;
import java.lang.annotation.*; import java.lang.annotation.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.redkale.service.LoadMode;
/** /**
* 定时任务标记只能作用于Service的无参数或者单一ScheduleEvent参数的方法上, 功能类似Spring里的Scheduled注解 * 定时任务标记只能作用于Service的无参数或者单一ScheduleEvent参数的方法上, 功能类似Spring里的Scheduled注解
@@ -82,6 +83,7 @@ public @interface Scheduled {
* #inits: 读取宿主对象的inits字段值作为值字段类型必须是int、long数值类型 * #inits: 读取宿主对象的inits字段值作为值字段类型必须是int、long数值类型
* *
* 值大于0且fixedRate和fixedDelay小于0则使用 ScheduledThreadPoolExecutor.schedule * 值大于0且fixedRate和fixedDelay小于0则使用 ScheduledThreadPoolExecutor.schedule
*
* @return 起始延迟时间 * @return 起始延迟时间
*/ */
String initialDelay() default "-1"; String initialDelay() default "-1";
@@ -100,4 +102,10 @@ public @interface Scheduled {
*/ */
String comment() default ""; String comment() default "";
/**
* Service加载模式
*
* @return 模式
*/
LoadMode mode() default LoadMode.LOCAL;
} }

View File

@@ -34,9 +34,11 @@ import org.redkale.annotation.Nullable;
import org.redkale.annotation.Resource; import org.redkale.annotation.Resource;
import org.redkale.annotation.ResourceType; import org.redkale.annotation.ResourceType;
import org.redkale.boot.Application; import org.redkale.boot.Application;
import org.redkale.net.sncp.Sncp;
import org.redkale.schedule.ScheduleEvent; import org.redkale.schedule.ScheduleEvent;
import org.redkale.schedule.ScheduleManager; import org.redkale.schedule.ScheduleManager;
import org.redkale.schedule.Scheduled; import org.redkale.schedule.Scheduled;
import org.redkale.service.LoadMode;
import org.redkale.service.Local; import org.redkale.service.Local;
import org.redkale.service.Service; import org.redkale.service.Service;
import org.redkale.util.AnyValue; import org.redkale.util.AnyValue;
@@ -123,6 +125,7 @@ public class ScheduleManagerService implements ScheduleManager, Service {
public boolean schedule(Object service) { public boolean schedule(Object service) {
lock.lock(); lock.lock();
try { try {
boolean remoteMode = service instanceof Service && Sncp.isRemote((Service) service);
for (WeakReference item : refTaskMap.keySet()) { for (WeakReference item : refTaskMap.keySet()) {
if (item.get() == service) { if (item.get() == service) {
logger.log(Level.WARNING, service + " repeat schedule"); 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 " throw new RedkaleException("@" + Scheduled.class.getSimpleName() + " must be on non-parameter or "
+ ScheduleEvent.class.getSimpleName() + "-parameter method, but on " + method); + ScheduleEvent.class.getSimpleName() + "-parameter method, but on " + method);
} }
ScheduledTask task = schedule(ref, method, taskCount); ScheduledTask task = schedule(ref, method, remoteMode, taskCount);
//时间没配置: task=null //时间没配置: task=null
if (task != null) { if (task != null) {
tasks.put(method.getName(), task); 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); Scheduled ann = method.getAnnotation(Scheduled.class);
if (!LoadMode.matches(remoteMode, ann.mode())) {
return null;
}
String name = getProperty(ann.name()); String name = getProperty(ann.name());
String cron = getProperty(ann.cron()); String cron = getProperty(ann.cron());
String fixedDelay = getProperty(ann.fixedDelay()); String fixedDelay = getProperty(ann.fixedDelay());

View File

@@ -0,0 +1,58 @@
/*
*
*/
package org.redkale.service;
/**
* Service加载模式
*
*
* <p>
* 详情见: 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;
}
}