增加LoadMode功能
This commit is contained in:
7
src/main/java/org/redkale/cache/Cached.java
vendored
7
src/main/java/org/redkale/cache/Cached.java
vendored
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
58
src/main/java/org/redkale/service/LoadMode.java
Normal file
58
src/main/java/org/redkale/service/LoadMode.java
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user