增加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 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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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());

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;
}
}