使用 Cron4j 表达式 在 Solon 里开发定时任务
cron4j 是一个轻量级的Java任务调度工具。cron4j-solon-plugin 是 solon 对 cron4j 的适配插件
添加 maven 引用
<dependency>
<groupId>org.noear</groupId>
<artifactId>cron4j-solon-plugin</artifactId>
<version>1.5.17</version>
</dependency>
cron4j的cron表达式最多只允许5个部分,每个部分用空格分隔开,从左至右分别表示“分”、“时”、“天”、“月”、“周”,具体规则如下:
分:取值从 0 到 59
时:取值从 0 到 23
天:取值从 1 到 31,字母 L 可用于表示月的最后一天
月:取值从 1 到 12,可以用别名表示:jan、feb、mar、apr、may、jun、jul、aug、sep、oct、nov、dec
周:取值从 0 到 6,0表示周日,6表示周六,可以用别名表示:sun、mon、tue、wed、thu、fri、sat
以上5个部分的分、时、天、月、周又分别支持如下字符:
数字 n :表示一个具体的时间点,例如 5 * * * * 表示 5 分这个时间点时执行
逗号 , :表示指定多个数值,例如 3,5 * * * * 表示 3 和 5 分这两个时间点执行
减号 - :表示范围,例如 1-3 * * * * 表示 1 分、2 分再到 3 分这三个时间点执行
星号 * :表示每一个时间点,例如 * * * * * 表示每分钟执行
除号 / :表示指定一个值的增加幅度。例如 */5表示每隔5分钟执行一次(序列:0:00, 0:05, 0:10, 0:15 等等)
常见错误:
cron4j在表达式中使用除号指定增加幅度时与linux稍有不同。例如在linux中表达式 10/3 * * * * 的含义是从第10分钟开始,每隔三分钟调度一次,而在cron4j中需要使用 10-59/3 * * * * 来表达。
cron4j-solon-plugin 插件的 @Cron5x 注解
Cron5x 表示,支持5段的 Cron 表达式;同时支持快速配置:s m h d,例:10s (每隔10秒跑一次)
新建代码文件,试一试
- java/jobapp/JobApp
- java/jobapp/controller/Cron4jRun1
- java/jobapp/controller/Cron4jRun2
- java/jobapp/controller/Cron4jTask
- reources/application.properties
代码
- JobApp 代码
JobApp.java
//
// 启用 Cron4j 主解的任务
//
@EnableCron4j
public class JobApp {
public static void main(String[] args) {
Solon.start(JobApp.class, args);
}
}
- 使用快捷配置模式:n + ms,s,m,h,d ;使用Runnable接口开发
Cron4jRun1.java
@Cron4j(cron5x = "2s", name = "job1")
public class Cron4jRun1 implements Runnable {
@Override
public void run() {
System.out.println("我是 Cron4jRun1 (2s)");
}
}
- 使用cron5x配置模式:* * * * * ;使用Runnable接口开发
Cron4jRun2.java
@Cron4j(cron5x = "*/1 * * * *")
public class Cron4jRun2 implements Runnable {
@Override
public void run() {
System.out.println("我是 Cron4jRun2 (*/1 * * * *)");
}
}
- 使用cron5x配置模式:* * * * * ;使用Task接口开发
Cron4jTask.java
@Cron4j(cron5x = "*/1 * * * *")
public class Cron4jTask extends Task {
@Override
public void execute(TaskExecutionContext context) throws RuntimeException
System.out.println("我是 Cron4jTask (*/1 * * * *)");
}
}
通过配置,控制有name的任务
application.properties
# solon.cron4j.{job name}
#
solon.cron4j.job1.cron5x=10s #重新定义时间表达式
solon.cron4j.job1.enable=true #用任务进行启停控制
运行输出
solon.plugin:: Start loading
file:/Users/xieyuejia/WORK/work_github/solon_demo/demo10.solon_schedule/target/classes/application.properties
jar:file:/Users/xieyuejia/.m2/repository/org/noear/cron4j-solon-plugin/1.2.20/cron4j-solon-plugin-1.2.20.jar!/solonplugin/solon.extend.cron4j.properties
我是定时任务: Cron4jRun1(200ms))
solon.plugin:: End loading @129ms
我是定时任务: Cron4jRun1(200ms)
DEMO源码