This commit is contained in:
redkale
2024-06-29 12:16:50 +08:00
parent f9d762534d
commit def85ca1ac
4 changed files with 93 additions and 87 deletions

View File

@@ -1,85 +1,85 @@
# 定时任务 # 定时任务
  @Scheduled注解在Service的方法上,实现对方法结果进行定时运行。方法必须是无参数或者```ScheduledEvent```参数。   @Scheduled注解在Service的方法上,实现对方法结果进行定时运行。方法必须是无参数或者```ScheduledEvent```参数。
## 属性说明 ## 属性说明
|属性|默认值|说明| |属性|默认值|说明|
| --- | --- | --- | | --- | --- | --- |
|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.scheduled.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.scheduled.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.scheduled.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.scheduled.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对象中的定时任务不起作用|
## 基本用法 ## 基本用法
&emsp;&emsp;每秒执行 &emsp;&emsp;每秒执行
```java ```java
@Scheduled(cron = "0/1 * * * * ?") @Scheduled(cron = "0/1 * * * * ?")
public void task1() { public void task1() {
System.out.println(Times.nowMillis() + "执行一次"); System.out.println(Times.nowMillis() + "执行一次");
} }
``` ```
&emsp;&emsp;<b>数值配置</b>, 系统启动后延迟10分钟后每60分钟执行一次 &emsp;&emsp;<b>数值配置</b>, 系统启动后延迟10分钟后每60分钟执行一次
```java ```java
@Scheduled(fixedDelay = "10", fixedRate = "60", timeUnit = TimeUnit.MINUTES) @Scheduled(fixedDelay = "10", fixedRate = "60", timeUnit = TimeUnit.MINUTES)
private void task3() { private void task3() {
System.out.println(Times.nowMillis() + "执行一次"); System.out.println(Times.nowMillis() + "执行一次");
} }
``` ```
&emsp;&emsp;<b>环境配置</b>, 定时间隔时间由环境变量```env.scheduled.fixedRate```配置没配置采用默认值60秒) &emsp;&emsp;<b>环境配置</b>, 定时间隔时间由环境变量```env.scheduled.fixedRate```配置没配置采用默认值60秒)
```java ```java
@Scheduled(fixedRate = "${env.scheduled.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 "";
} }
``` ```
## 基本配置 ## 基本配置
```xml ```xml
<!-- <!--
全局Serivce的定时任务设置没配置该节点将自动创建一个。 全局Serivce的定时任务设置没配置该节点将自动创建一个。
enabled 是否开启缓存功能。默认: true enabled 是否开启缓存功能。默认: true
--> -->
<scheduled enabled="true"/> <scheduled enabled="true"/>
``` ```
## 使用Xxl-Job ## 使用Xxl-Job
&emsp;&emsp;Scheduled可以采用第三方实现, 官方扩展包```redkale-plugins```提供了xxl-job实现且不依赖xxl-job包。 &emsp;&emsp;Scheduled可以采用第三方实现, 官方扩展包```redkale-plugins```提供了xxl-job实现且不依赖xxl-job包。
### pom依赖 ### pom依赖
```xml ```xml
<dependency> <dependency>
<groupId>org.redkalex</groupId> <groupId>org.redkalex</groupId>
<artifactId>redkale-plugins</artifactId> <artifactId>redkale-plugins</artifactId>
<version>2.8.0</version> <version>2.8.0</version>
</dependency> </dependency>
``` ```
### 配置文件 ### 配置文件
```xml ```xml
<scheduled enabled="true"> <scheduled enabled="true">
<xxljob addresses="http://localhost:8080/xxl-job-admin" <xxljob addresses="http://localhost:8080/xxl-job-admin"
executorName="redkale-examples" executorName="redkale-examples"
ip="127.0.0.1" <!-- 可选 --> ip="127.0.0.1" <!-- 可选 -->
port="5678" <!-- 可选 --> port="5678" <!-- 可选 -->
accessToken="default_token" /> accessToken="default_token" />
</scheduled> </scheduled>
``` ```
### 使用方法 ### 使用方法
```java ```java
@Scheduled(name = "testTask") @Scheduled(name = "testTask")
public void runTask(ScheduleEvent event) { public void runTask(ScheduledEvent event) {
System.out.println("xxl-job参数param: " + event.getString("param")); System.out.println("xxl-job参数param: " + event.getString("param"));
System.out.println("xxl-job参数index: " + event.getInteger("index")); System.out.println("xxl-job参数index: " + event.getInteger("index"));
System.out.println("xxl-job参数total: " + event.getInteger("total")); System.out.println("xxl-job参数total: " + event.getInteger("total"));
} }
``` ```

View File

@@ -139,7 +139,7 @@ public class CachedManagerService implements CachedManager, CachedActionFunc, Se
* 检查name是否含特殊字符 * 检查name是否含特殊字符
* *
* @param value 参数 * @param value 参数
* @return * @return value
*/ */
protected String checkSchema(String value) { protected String checkSchema(String value) {
if (value != null && !value.isEmpty()) { if (value != null && !value.isEmpty()) {

View File

@@ -8,7 +8,7 @@ import java.util.concurrent.TimeUnit;
import org.redkale.service.LoadMode; import org.redkale.service.LoadMode;
/** /**
* 定时任务标记只能作用于Service的无参数或者单一ScheduleEvent参数的菲static方法上, 功能类似Spring里的Scheduled注解 * 定时任务标记只能作用于Service的无参数或者单一{@link org.redkale.scheduled.ScheduledEvent}参数的菲static方法上, 功能类似Spring里的Scheduled注解
* *
* <p>详情见: https://redkale.org * <p>详情见: https://redkale.org
* *

View File

@@ -36,7 +36,13 @@ public final class ScheduledEvent {
public <T> T getJson(String name, Type type) { public <T> T getJson(String name, Type type) {
Object obj = get(name); Object obj = get(name);
return obj == null ? null : JsonConvert.root().convertFrom(type, obj.toString()); if (obj == null) {
return null;
} else if (type instanceof Class && ((Class) type).isAssignableFrom(obj.getClass())) {
return (T) obj;
} else {
return JsonConvert.root().convertFrom(type, obj.toString());
}
} }
public String getString(String name) { public String getString(String name) {