scheduled优化

This commit is contained in:
redkale
2024-06-08 19:00:19 +08:00
parent ca7c0d47b0
commit 74b91ac5b0
19 changed files with 200 additions and 177 deletions

View File

@@ -5,11 +5,11 @@
|属性|默认值|说明| |属性|默认值|说明|
| --- | --- | --- | | --- | --- | --- |
|name|未定义|名称, 可用于第三方实现的定时任务组件的key, 比如xxl-job的任务标识| |name|未定义|名称, 可用于第三方实现的定时任务组件的key, 比如xxl-job的任务标识|
|cron|未定义|cron表达式也可以使用常量值: <br> &emsp;@yearly、@annually、@monthly、@weekly、<br> &emsp;@daily、@midnight、@hourly、@minutely <br> &emsp;@1m、@2m、@3m、@5m、@10m、@15m、@30m <br> &emsp;@1h、@2h、@3h、@6h <br> &emsp;${env.scheduling.cron}: 读取系统配置项| |cron|未定义|cron表达式也可以使用常量值: <br> &emsp;@yearly、@annually、@monthly、@weekly、<br> &emsp;@daily、@midnight、@hourly、@minutely <br> &emsp;@1m、@2m、@3m、@5m、@10m、@15m、@30m <br> &emsp;@1h、@2h、@3h、@6h <br> &emsp;${env.scheduled.cron}: 读取系统配置项|
|zone|未定义|时区,```cron```有值才有效, 例如: "Asia/Shanghai"| |zone|未定义|时区,```cron```有值才有效, 例如: "Asia/Shanghai"|
|fixedDelay|-1|延迟时间,负数为无效值,支持参数配置、乘法表达式和对象字段值 <br> 参数值支持方式:<br> &emsp;100: 设置数值 <br> &emsp;${env.scheduling.fixedDelay}: 读取系统配置项 <br> 值大于0且fixedRate小于0则使用 ScheduledThreadPoolExecutor.scheduleWithFixedDelay | |fixedDelay|-1|延迟时间,负数为无效值,支持参数配置、乘法表达式和对象字段值 <br> 参数值支持方式:<br> &emsp;100: 设置数值 <br> &emsp;${env.scheduled.fixedDelay}: 读取系统配置项 <br> 值大于0且fixedRate小于0则使用 ScheduledThreadPoolExecutor.scheduleWithFixedDelay |
|fixedRate|-1|周期时间,负数为无效值,支持参数配置、乘法表达式和对象字段值 <br> 参数值支持方式:<br> &emsp;100: 设置数值 <br> &emsp;${env.scheduling.fixedRate}: 读取系统配置项 <br> 值大于0且fixedRate小于0则使用 ScheduledThreadPoolExecutor.scheduleAtFixedRate | |fixedRate|-1|周期时间,负数为无效值,支持参数配置、乘法表达式和对象字段值 <br> 参数值支持方式:<br> &emsp;100: 设置数值 <br> &emsp;${env.scheduled.fixedRate}: 读取系统配置项 <br> 值大于0且fixedRate小于0则使用 ScheduledThreadPoolExecutor.scheduleAtFixedRate |
|initialDelay|-1|起始延迟时间,负数为无效值,支持参数配置、乘法表达式和对象字段值 <br> 参数值支持方式:<br> &emsp;100: 设置数值 <br> &emsp;${env.scheduling.initialDelay}: 读取系统配置项 <br> 值大于0且fixedRate和fixedDelay小于0则使用 ScheduledThreadPoolExecutor.schedule | |initialDelay|-1|起始延迟时间,负数为无效值,支持参数配置、乘法表达式和对象字段值 <br> 参数值支持方式:<br> &emsp;100: 设置数值 <br> &emsp;${env.scheduled.initialDelay}: 读取系统配置项 <br> 值大于0且fixedRate和fixedDelay小于0则使用 ScheduledThreadPoolExecutor.schedule |
|timeUnit|```TimeUnit.SECONDS```|时间单位TimeUnit| |timeUnit|```TimeUnit.SECONDS```|时间单位TimeUnit|
|comment|未定义|备注描述| |comment|未定义|备注描述|
|mode|```LoadMode.LOCAL```|作用于Service模式默认值为LOCAL<br> LOCAL: 表示远程模式的Service对象中的定时任务不起作用| |mode|```LoadMode.LOCAL```|作用于Service模式默认值为LOCAL<br> LOCAL: 表示远程模式的Service对象中的定时任务不起作用|
@@ -31,9 +31,9 @@
} }
``` ```
&emsp;&emsp;<b>环境配置</b>, 定时间隔时间由环境变量```env.schedule.fixedRate```配置没配置采用默认值60秒) &emsp;&emsp;<b>环境配置</b>, 定时间隔时间由环境变量```env.scheduled.fixedRate```配置没配置采用默认值60秒)
```java ```java
@Scheduled(fixedRate = "${env.schedule.fixedRate:60}") @Scheduled(fixedRate = "${env.scheduled.fixedRate:60}")
public String task2() { public String task2() {
System.out.println(Times.nowMillis() + "执行一次"); System.out.println(Times.nowMillis() + "执行一次");
return ""; return "";
@@ -47,7 +47,7 @@
全局Serivce的定时任务设置没配置该节点将自动创建一个。 全局Serivce的定时任务设置没配置该节点将自动创建一个。
enabled 是否开启缓存功能。默认: true enabled 是否开启缓存功能。默认: true
--> -->
<schedule enabled="true"/> <scheduled enabled="true"/>
``` ```

View File

@@ -40,7 +40,7 @@ serviceid1_name1 serviceid1_name2 serviceid2_name1 serviceid2_name2
全局Serivce的定时任务设置没配置该节点将自动创建一个。 全局Serivce的定时任务设置没配置该节点将自动创建一个。
enabled 是否开启缓存功能。默认: true enabled 是否开启缓存功能。默认: true
--> -->
<schedule enabled="true"/> <scheduled enabled="true"/>
<!-- <!--
【节点全局唯一】 @since 2.8.0 【节点全局唯一】 @since 2.8.0

View File

@@ -34,8 +34,8 @@ module org.redkale {
exports org.redkale.net.sncp; exports org.redkale.net.sncp;
exports org.redkale.persistence; exports org.redkale.persistence;
exports org.redkale.props.spi; exports org.redkale.props.spi;
exports org.redkale.schedule; exports org.redkale.scheduled;
exports org.redkale.schedule.spi; exports org.redkale.scheduled.spi;
exports org.redkale.service; exports org.redkale.service;
exports org.redkale.source; exports org.redkale.source;
exports org.redkale.source.spi; exports org.redkale.source.spi;
@@ -47,7 +47,7 @@ module org.redkale {
uses org.redkale.cluster.spi.ClusterAgentProvider; uses org.redkale.cluster.spi.ClusterAgentProvider;
uses org.redkale.convert.spi.ConvertProvider; uses org.redkale.convert.spi.ConvertProvider;
uses org.redkale.mq.spi.MessageAgentProvider; uses org.redkale.mq.spi.MessageAgentProvider;
uses org.redkale.schedule.spi.ScheduleManagerProvider; uses org.redkale.scheduled.spi.ScheduledManagerProvider;
uses org.redkale.source.spi.CacheSourceProvider; uses org.redkale.source.spi.CacheSourceProvider;
uses org.redkale.source.spi.DataSourceProvider; uses org.redkale.source.spi.DataSourceProvider;
uses org.redkale.source.spi.DataNativeSqlParserProvider; uses org.redkale.source.spi.DataNativeSqlParserProvider;

View File

@@ -42,7 +42,7 @@ import org.redkale.net.*;
import org.redkale.net.http.*; import org.redkale.net.http.*;
import org.redkale.net.sncp.*; import org.redkale.net.sncp.*;
import org.redkale.props.spi.PropertiesModule; import org.redkale.props.spi.PropertiesModule;
import org.redkale.schedule.spi.ScheduleModuleEngine; import org.redkale.scheduled.spi.ScheduledModuleEngine;
import org.redkale.service.Service; import org.redkale.service.Service;
import org.redkale.source.*; import org.redkale.source.*;
import org.redkale.source.spi.SourceModuleEngine; import org.redkale.source.spi.SourceModuleEngine;
@@ -311,7 +311,7 @@ public final class Application {
moduleEngines.add(this.sourceModule); // 放第一很多module依赖于source moduleEngines.add(this.sourceModule); // 放第一很多module依赖于source
moduleEngines.add(new MessageModuleEngine(this)); moduleEngines.add(new MessageModuleEngine(this));
moduleEngines.add(new ClusterModuleEngine(this)); moduleEngines.add(new ClusterModuleEngine(this));
moduleEngines.add(new ScheduleModuleEngine(this)); moduleEngines.add(new ScheduledModuleEngine(this));
moduleEngines.add(new CachedModuleEngine(this)); moduleEngines.add(new CachedModuleEngine(this));
moduleEngines.add(new LockedModuleEngine(this)); moduleEngines.add(new LockedModuleEngine(this));

View File

@@ -39,6 +39,7 @@ abstract class AsyncNioConnection extends AsyncConnection {
protected final AsyncNioCompletionHandler<ByteBuffer> readTimeoutCompletionHandler = protected final AsyncNioCompletionHandler<ByteBuffer> readTimeoutCompletionHandler =
new AsyncNioCompletionHandler<>(true, this); new AsyncNioCompletionHandler<>(true, this);
//值大于0才有效
protected int readTimeoutSeconds; protected int readTimeoutSeconds;
protected ByteBuffer readByteBuffer; protected ByteBuffer readByteBuffer;
@@ -51,6 +52,7 @@ abstract class AsyncNioConnection extends AsyncConnection {
protected final AsyncNioCompletionHandler<Object> writeTimeoutCompletionHandler = protected final AsyncNioCompletionHandler<Object> writeTimeoutCompletionHandler =
new AsyncNioCompletionHandler<>(false, this); new AsyncNioCompletionHandler<>(false, this);
//值大于0才有效
protected int writeTimeoutSeconds; protected int writeTimeoutSeconds;
protected byte[] writeByteTuple1Array; protected byte[] writeByteTuple1Array;

View File

@@ -333,6 +333,15 @@ public abstract class Client<C extends ClientConnection<R, P>, R extends ClientR
return connect(addr, WorkThread.currentWorkThread(), false); return connect(addr, WorkThread.currentWorkThread(), false);
} }
public final CompletableFuture<C> newConnection(int readTimeout, int writeTimeout) {
return connect(getAddress(null), WorkThread.currentWorkThread(), false, readTimeout, writeTimeout);
}
// 指定地址获取连接
public final CompletableFuture<C> newConnection(SocketAddress addr, int readTimeout, int writeTimeout) {
return connect(addr, WorkThread.currentWorkThread(), false, readTimeout, writeTimeout);
}
public final CompletableFuture<C> connect() { public final CompletableFuture<C> connect() {
return connect(getAddress(null), WorkThread.currentWorkThread(), true); return connect(getAddress(null), WorkThread.currentWorkThread(), true);
} }
@@ -354,6 +363,16 @@ public abstract class Client<C extends ClientConnection<R, P>, R extends ClientR
// 指定地址获取连接 // 指定地址获取连接
private CompletableFuture<C> connect( private CompletableFuture<C> connect(
@Nonnull final SocketAddress addr, @Nullable final WorkThread workThread, final boolean pool) { @Nonnull final SocketAddress addr, @Nullable final WorkThread workThread, final boolean pool) {
return connect(addr, workThread, pool, readTimeoutSeconds, writeTimeoutSeconds);
}
// 指定地址获取连接
private CompletableFuture<C> connect(
@Nonnull final SocketAddress addr,
@Nullable final WorkThread workThread,
final boolean pool,
final int readTimeout,
final int writeTimeout) {
if (addr == null) { if (addr == null) {
return CompletableFuture.failedFuture(new NullPointerException("address is empty")); return CompletableFuture.failedFuture(new NullPointerException("address is empty"));
} }
@@ -366,7 +385,7 @@ public abstract class Client<C extends ClientConnection<R, P>, R extends ClientR
final Queue<CompletableFuture<C>> waitQueue = entry.connAcquireWaitings; final Queue<CompletableFuture<C>> waitQueue = entry.connAcquireWaitings;
if (!pool || entry.connOpenState.compareAndSet(false, true)) { if (!pool || entry.connOpenState.compareAndSet(false, true)) {
CompletableFuture<C> future = group.createClient( CompletableFuture<C> future = group.createClient(
tcp, addr, connectTimeoutSeconds, readTimeoutSeconds, writeTimeoutSeconds) tcp, addr, connectTimeoutSeconds, readTimeout, writeTimeout)
.thenApply(c -> .thenApply(c ->
(C) createClientConnection(c).setConnEntry(entry).setMaxPipelines(maxPipelines)); (C) createClientConnection(c).setConnEntry(entry).setMaxPipelines(maxPipelines));
R virtualReq = createVirtualRequestAfterConnect(); R virtualReq = createVirtualRequestAfterConnect();

View File

@@ -24,7 +24,7 @@ import org.redkale.inject.ResourceFactory;
import org.redkale.mq.spi.MessageAgent; import org.redkale.mq.spi.MessageAgent;
import org.redkale.net.http.WebSocketNode; import org.redkale.net.http.WebSocketNode;
import org.redkale.net.sncp.SncpRemoteInfo.SncpRemoteAction; import org.redkale.net.sncp.SncpRemoteInfo.SncpRemoteAction;
import org.redkale.schedule.Scheduled; import org.redkale.scheduled.Scheduled;
import org.redkale.service.*; import org.redkale.service.*;
import org.redkale.util.AnyValue; import org.redkale.util.AnyValue;
import org.redkale.util.RedkaleClassLoader; import org.redkale.util.RedkaleClassLoader;

View File

@@ -175,9 +175,9 @@ public class PropertiesModule extends BootModule {
if (key.startsWith("redkale.executor.") // 节点全局唯一 if (key.startsWith("redkale.executor.") // 节点全局唯一
|| key.startsWith("redkale.transport.") // 节点全局唯一 || key.startsWith("redkale.transport.") // 节点全局唯一
|| key.startsWith("redkale.cluster.") // 节点全局唯一 || key.startsWith("redkale.cluster.") // 节点全局唯一
|| key.startsWith("redkale.cache.") // 节点全局唯一 || key.startsWith("redkale.cached.") // 节点全局唯一
|| key.startsWith("redkale.schedule.") // 节点全局唯一 || key.startsWith("redkale.scheduled.") // 节点全局唯一
|| key.startsWith("redkale.lock.") // 节点全局唯一 || key.startsWith("redkale.locked.") // 节点全局唯一
|| key.startsWith("redkale.mq.") || key.startsWith("redkale.mq.")
|| key.startsWith("redkale.mq[") || key.startsWith("redkale.mq[")
|| key.startsWith("redkale.group.") || key.startsWith("redkale.group.")

View File

@@ -1,17 +0,0 @@
/*
*
*/
package org.redkale.schedule.spi;
import org.redkale.schedule.ScheduleManager;
import org.redkale.util.InstanceProvider;
/**
* 自定义的ScheduleManager加载器, 如果标记&#64;Priority加载器的优先级需要大于1000 1000以下预留给官方加载器
*
* <p>详情见: https://redkale.org
*
* @author zhangjx
* @since 2.8.0
*/
public interface ScheduleManagerProvider extends InstanceProvider<ScheduleManager> {}

View File

@@ -1,7 +1,7 @@
/* /*
* *
*/ */
package org.redkale.schedule; package org.redkale.scheduled;
import java.lang.annotation.*; import java.lang.annotation.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;

View File

@@ -1,7 +1,7 @@
/* /*
* *
*/ */
package org.redkale.schedule; package org.redkale.scheduled;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.HashMap; import java.util.HashMap;
@@ -17,15 +17,15 @@ import org.redkale.util.Utility;
* @author zhangjx * @author zhangjx
* @since 2.8.0 * @since 2.8.0
*/ */
public final class ScheduleEvent { public final class ScheduledEvent {
private final Map<String, Object> map; private final Map<String, Object> map;
public ScheduleEvent() { public ScheduledEvent() {
this.map = new HashMap<>(); this.map = new HashMap<>();
} }
public ScheduleEvent(Map<String, Object> map) { public ScheduledEvent(Map<String, Object> map) {
this.map = map; this.map = map;
} }
@@ -67,7 +67,7 @@ public final class ScheduleEvent {
return Utility.convertValue(long.class, val); return Utility.convertValue(long.class, val);
} }
public ScheduleEvent clear() { public ScheduledEvent clear() {
map.clear(); map.clear();
return this; return this;
} }

View File

@@ -1,7 +1,7 @@
/* /*
* *
*/ */
package org.redkale.schedule; package org.redkale.scheduled;
/** /**
* 定时管理器 * 定时管理器
@@ -11,7 +11,7 @@ package org.redkale.schedule;
* @author zhangjx * @author zhangjx
* @since 2.8.0 * @since 2.8.0
*/ */
public interface ScheduleManager { public interface ScheduledManager {
/** /**
* 开启宿主对象中所有的定时任务方法. 存在定时任务方法返回true否则返回false * 开启宿主对象中所有的定时任务方法. 存在定时任务方法返回true否则返回false
@@ -23,7 +23,7 @@ public interface ScheduleManager {
/** /**
* 开启所有宿主对象中指定的任务名 * 开启所有宿主对象中指定的任务名
* *
* @see org.redkale.schedule.Scheduled#name() * @see org.redkale.scheduled.Scheduled#name()
* @param scheduleName 定时任务名称 * @param scheduleName 定时任务名称
* @return 返回任务数量 * @return 返回任务数量
*/ */
@@ -39,7 +39,7 @@ public interface ScheduleManager {
/** /**
* 关闭所有宿主对象中指定的任务名 * 关闭所有宿主对象中指定的任务名
* *
* @see org.redkale.schedule.Scheduled#name() * @see org.redkale.scheduled.Scheduled#name()
* @param scheduleName 定时任务名称 * @param scheduleName 定时任务名称
* @return 返回任务数量 * @return 返回任务数量
*/ */

View File

@@ -1,7 +1,7 @@
/* /*
* *
*/ */
package org.redkale.schedule.spi; package org.redkale.scheduled.spi;
import java.time.DateTimeException; import java.time.DateTimeException;
import java.time.temporal.ChronoField; import java.time.temporal.ChronoField;

View File

@@ -1,7 +1,7 @@
/* /*
* *
*/ */
package org.redkale.schedule.spi; package org.redkale.scheduled.spi;
import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
@@ -36,9 +36,8 @@ 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.net.sncp.Sncp;
import org.redkale.schedule.ScheduleEvent; import org.redkale.scheduled.ScheduledEvent;
import org.redkale.schedule.ScheduleManager; import org.redkale.scheduled.Scheduled;
import org.redkale.schedule.Scheduled;
import org.redkale.service.LoadMode; 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;
@@ -46,6 +45,7 @@ import org.redkale.util.AnyValue;
import org.redkale.util.RedkaleClassLoader; import org.redkale.util.RedkaleClassLoader;
import org.redkale.util.RedkaleException; import org.redkale.util.RedkaleException;
import org.redkale.util.Utility; import org.redkale.util.Utility;
import org.redkale.scheduled.ScheduledManager;
/** /**
* 定时任务管理器 * 定时任务管理器
@@ -58,8 +58,8 @@ import org.redkale.util.Utility;
@Local @Local
@Component @Component
@AutoLoad(false) @AutoLoad(false)
@ResourceType(ScheduleManager.class) @ResourceType(ScheduledManager.class)
public class ScheduleManagerService implements ScheduleManager, Service { public class ScheduleManagerService implements ScheduledManager, Service {
protected final Logger logger = Logger.getLogger(this.getClass().getSimpleName()); protected final Logger logger = Logger.getLogger(this.getClass().getSimpleName());
@@ -157,10 +157,10 @@ public class ScheduleManagerService implements ScheduleManager, Service {
methodKeys.add(mk); methodKeys.add(mk);
if (method.getParameterCount() != 0 if (method.getParameterCount() != 0
&& !(method.getParameterCount() == 1 && !(method.getParameterCount() == 1
&& method.getParameterTypes()[0] == ScheduleEvent.class)) { && method.getParameterTypes()[0] == ScheduledEvent.class)) {
throw new RedkaleException( throw new RedkaleException(
"@" + Scheduled.class.getSimpleName() + " must be on non-parameter or " "@" + Scheduled.class.getSimpleName() + " must be on non-parameter or "
+ ScheduleEvent.class.getSimpleName() + "-parameter method, but on " + method); + ScheduledEvent.class.getSimpleName() + "-parameter method, but on " + method);
} }
ScheduledTask task = schedule(ref, method, remoteMode); ScheduledTask task = schedule(ref, method, remoteMode);
// 时间没配置: task=null // 时间没配置: task=null
@@ -251,7 +251,7 @@ public class ScheduleManagerService implements ScheduleManager, Service {
return null; return null;
} }
protected Function<ScheduleEvent, Object> createFuncJob(final WeakReference ref, Method method) { protected Function<ScheduledEvent, Object> createFuncJob(final WeakReference ref, Method method) {
try { try {
if (!Modifier.isPublic(method.getModifiers())) { if (!Modifier.isPublic(method.getModifiers())) {
method.setAccessible(true); method.setAccessible(true);
@@ -338,7 +338,7 @@ public class ScheduleManagerService implements ScheduleManager, Service {
protected ScheduledFuture future; protected ScheduledFuture future;
protected final ScheduleEvent event; protected final ScheduledEvent event;
protected final Map<String, Object> eventMap; protected final Map<String, Object> eventMap;
@@ -353,7 +353,7 @@ public class ScheduleManagerService implements ScheduleManager, Service {
this.name = name; this.name = name;
this.method = method; this.method = method;
this.eventMap = method.getParameterCount() == 0 ? null : new HashMap<>(); this.eventMap = method.getParameterCount() == 0 ? null : new HashMap<>();
this.event = eventMap == null ? null : new ScheduleEvent(eventMap); this.event = eventMap == null ? null : new ScheduledEvent(eventMap);
} }
public void init() { public void init() {
@@ -389,7 +389,7 @@ public class ScheduleManagerService implements ScheduleManager, Service {
protected class FixedTask extends ScheduledTask implements Runnable { protected class FixedTask extends ScheduledTask implements Runnable {
private final Function<ScheduleEvent, Object> delegate; private final Function<ScheduledEvent, Object> delegate;
private final long fixedDelay; private final long fixedDelay;
@@ -447,7 +447,7 @@ public class ScheduleManagerService implements ScheduleManager, Service {
protected class CronTask extends ScheduledTask implements Runnable { protected class CronTask extends ScheduledTask implements Runnable {
private final Function<ScheduleEvent, Object> delegate; private final Function<ScheduledEvent, Object> delegate;
private final CronExpression cron; private final CronExpression cron;

View File

@@ -0,0 +1,17 @@
/*
*
*/
package org.redkale.scheduled.spi;
import org.redkale.scheduled.ScheduledManager;
import org.redkale.util.InstanceProvider;
/**
* 自定义的ScheduledManager加载器, 如果标记&#64;Priority加载器的优先级需要大于1000 1000以下预留给官方加载器
*
* <p>详情见: https://redkale.org
*
* @author zhangjx
* @since 2.8.0
*/
public interface ScheduledManagerProvider extends InstanceProvider<ScheduledManager> {}

View File

@@ -1,7 +1,7 @@
/* /*
* *
*/ */
package org.redkale.schedule.spi; package org.redkale.scheduled.spi;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
@@ -9,22 +9,24 @@ import java.util.List;
import java.util.ServiceLoader; import java.util.ServiceLoader;
import org.redkale.boot.Application; import org.redkale.boot.Application;
import org.redkale.boot.ModuleEngine; import org.redkale.boot.ModuleEngine;
import org.redkale.schedule.ScheduleManager; import org.redkale.scheduled.ScheduledManager;
import org.redkale.service.Service; import org.redkale.service.Service;
import org.redkale.util.AnyValue; import org.redkale.util.AnyValue;
import org.redkale.util.InstanceProvider; import org.redkale.util.InstanceProvider;
import org.redkale.util.RedkaleClassLoader; import org.redkale.util.RedkaleClassLoader;
/** @author zhangjx */ /** @author zhangjx */
public class ScheduleModuleEngine extends ModuleEngine { public class ScheduledModuleEngine extends ModuleEngine {
protected static final String CONFIG_NAME = "scheduled";
// 全局定时任务管理器 // 全局定时任务管理器
private ScheduleManager scheduleManager; private ScheduledManager scheduledManager;
// 配置 // 配置
protected AnyValue config; protected AnyValue config;
public ScheduleModuleEngine(Application application) { public ScheduledModuleEngine(Application application) {
super(application); super(application);
} }
@@ -39,7 +41,7 @@ public class ScheduleModuleEngine extends ModuleEngine {
*/ */
@Override @Override
public AnyValue.MergeEnum mergeAppConfigStrategy(String path, String key, AnyValue val1, AnyValue val2) { public AnyValue.MergeEnum mergeAppConfigStrategy(String path, String key, AnyValue val1, AnyValue val2) {
if ("".equals(path) && "schedule".equals(key)) { if ("".equals(path) && CONFIG_NAME.equals(key)) {
return AnyValue.MergeEnum.REPLACE; return AnyValue.MergeEnum.REPLACE;
} }
return null; return null;
@@ -49,15 +51,15 @@ public class ScheduleModuleEngine extends ModuleEngine {
@Override @Override
public void onAppPostInit() { public void onAppPostInit() {
// 设置定时管理器 // 设置定时管理器
this.config = application.getAppConfig().getAnyValue("schedule"); this.config = application.getAppConfig().getAnyValue(CONFIG_NAME);
this.scheduleManager = createManager(this.config); this.scheduledManager = createManager(this.config);
if (!application.isCompileMode()) { if (!application.isCompileMode()) {
this.resourceFactory.inject(this.scheduleManager); this.resourceFactory.inject(this.scheduledManager);
if (this.scheduleManager instanceof Service) { if (this.scheduledManager instanceof Service) {
((Service) this.scheduleManager).init(this.config); ((Service) this.scheduledManager).init(this.config);
} }
} }
this.resourceFactory.register("", ScheduleManager.class, this.scheduleManager); this.resourceFactory.register("", ScheduledManager.class, this.scheduledManager);
} }
/** /**
@@ -67,7 +69,7 @@ public class ScheduleModuleEngine extends ModuleEngine {
*/ */
@Override @Override
public void onServicePostInit(Service service) { public void onServicePostInit(Service service) {
this.scheduleManager.schedule(service); this.scheduledManager.schedule(service);
} }
/** /**
@@ -77,48 +79,48 @@ public class ScheduleModuleEngine extends ModuleEngine {
*/ */
@Override @Override
public void onServicePreDestroy(Service service) { public void onServicePreDestroy(Service service) {
this.scheduleManager.unschedule(service); this.scheduledManager.unschedule(service);
} }
/** 服务全部启动前被调用 */ /** 服务全部启动前被调用 */
@Override @Override
public void onServersPreStart() { public void onServersPreStart() {
if (this.scheduleManager instanceof ScheduleManagerService) { if (this.scheduledManager instanceof ScheduleManagerService) {
((ScheduleManagerService) this.scheduleManager).onServersPreStart(); ((ScheduleManagerService) this.scheduledManager).onServersPreStart();
} }
} }
/** 服务全部启动后被调用 */ /** 服务全部启动后被调用 */
@Override @Override
public void onServersPostStart() { public void onServersPostStart() {
if (this.scheduleManager instanceof ScheduleManagerService) { if (this.scheduledManager instanceof ScheduleManagerService) {
((ScheduleManagerService) this.scheduleManager).onServersPostStart(); ((ScheduleManagerService) this.scheduledManager).onServersPostStart();
} }
} }
/** 进入Application.shutdown方法被调用 */ /** 进入Application.shutdown方法被调用 */
@Override @Override
public void onAppPreShutdown() { public void onAppPreShutdown() {
if (!application.isCompileMode() && this.scheduleManager instanceof Service) { if (!application.isCompileMode() && this.scheduledManager instanceof Service) {
((Service) this.scheduleManager).destroy(this.config); ((Service) this.scheduledManager).destroy(this.config);
} }
} }
private ScheduleManager createManager(AnyValue conf) { private ScheduledManager createManager(AnyValue conf) {
Iterator<ScheduleManagerProvider> it = ServiceLoader.load( Iterator<ScheduledManagerProvider> it = ServiceLoader.load(
ScheduleManagerProvider.class, application.getClassLoader()) ScheduledManagerProvider.class, application.getClassLoader())
.iterator(); .iterator();
RedkaleClassLoader.putServiceLoader(ScheduleManagerProvider.class); RedkaleClassLoader.putServiceLoader(ScheduledManagerProvider.class);
List<ScheduleManagerProvider> providers = new ArrayList<>(); List<ScheduledManagerProvider> providers = new ArrayList<>();
while (it.hasNext()) { while (it.hasNext()) {
ScheduleManagerProvider provider = it.next(); ScheduledManagerProvider provider = it.next();
if (provider != null && provider.acceptsConf(conf)) { if (provider != null && provider.acceptsConf(conf)) {
RedkaleClassLoader.putReflectionPublicConstructors( RedkaleClassLoader.putReflectionPublicConstructors(
provider.getClass(), provider.getClass().getName()); provider.getClass(), provider.getClass().getName());
providers.add(provider); providers.add(provider);
} }
} }
for (ScheduleManagerProvider provider : InstanceProvider.sort(providers)) { for (ScheduledManagerProvider provider : InstanceProvider.sort(providers)) {
return provider.createInstance(); return provider.createInstance();
} }
return ScheduleManagerService.create(null).enabled(false); return ScheduleManagerService.create(null).enabled(false);

View File

@@ -37,8 +37,8 @@ public class RedkaleClassLoader extends URLClassLoader {
"org.redkale.asm", "org.redkale.asm",
"org.redkale.boot", "org.redkale.boot",
"org.redkale.boot.watch", "org.redkale.boot.watch",
"org.redkale.cache", "org.redkale.cached",
"org.redkale.cache.spi", "org.redkale.cached.spi",
"org.redkale.cluster", "org.redkale.cluster",
"org.redkale.cluster.spi", "org.redkale.cluster.spi",
"org.redkale.convert", "org.redkale.convert",
@@ -48,8 +48,8 @@ public class RedkaleClassLoader extends URLClassLoader {
"org.redkale.convert.proto", "org.redkale.convert.proto",
"org.redkale.convert.spi", "org.redkale.convert.spi",
"org.redkale.inject", "org.redkale.inject",
"org.redkale.lock", "org.redkale.locked",
"org.redkale.lock.spi", "org.redkale.locked.spi",
"org.redkale.mq", "org.redkale.mq",
"org.redkale.mq.spi", "org.redkale.mq.spi",
"org.redkale.net", "org.redkale.net",
@@ -58,8 +58,8 @@ public class RedkaleClassLoader extends URLClassLoader {
"org.redkale.net.sncp", "org.redkale.net.sncp",
"org.redkale.persistence", "org.redkale.persistence",
"org.redkale.props.spi", "org.redkale.props.spi",
"org.redkale.schedule", "org.redkale.scheduled",
"org.redkale.schedule.spi", "org.redkale.scheduled.spi",
"org.redkale.service", "org.redkale.service",
"org.redkale.source", "org.redkale.source",
"org.redkale.source.spi", "org.redkale.source.spi",

View File

@@ -1,14 +1,14 @@
/* /*
* *
*/ */
package org.redkale.test.schedule; package org.redkale.test.scheduled;
import org.redkale.schedule.Scheduled; import org.redkale.scheduled.Scheduled;
import org.redkale.service.Service; import org.redkale.service.Service;
import org.redkale.util.Times; import org.redkale.util.Times;
/** @author zhangjx */ /** @author zhangjx */
public class ScheduleService implements Service { public class ScheduledService implements Service {
@Scheduled(cron = "0/1 * * * * ?") @Scheduled(cron = "0/1 * * * * ?")
public void task1() { public void task1() {

View File

@@ -1,17 +1,17 @@
/* /*
* *
*/ */
package org.redkale.test.schedule; package org.redkale.test.scheduled;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.redkale.schedule.spi.ScheduleManagerService; import org.redkale.scheduled.spi.ScheduleManagerService;
import org.redkale.util.Utility; import org.redkale.util.Utility;
/** @author zhangjx */ /** @author zhangjx */
public class SchedulingTest { public class ScheduledTest {
public static void main(String[] args) throws Throwable { public static void main(String[] args) throws Throwable {
SchedulingTest test = new SchedulingTest(); ScheduledTest test = new ScheduledTest();
test.run(); test.run();
} }
@@ -19,7 +19,7 @@ public class SchedulingTest {
public void run() throws Exception { public void run() throws Exception {
ScheduleManagerService manager = ScheduleManagerService.create(null); ScheduleManagerService manager = ScheduleManagerService.create(null);
manager.init(null); manager.init(null);
ScheduleService service = new ScheduleService(); ScheduledService service = new ScheduledService();
manager.schedule(service); manager.schedule(service);
Utility.sleep(3000); Utility.sleep(3000);
manager.unschedule(service); manager.unschedule(service);