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