spring之定时任务
一. 概述
在spring中支持三种主流的定时任务: JDK自带的定时任务Timer, 开源项目quartz,以及spring自带的定时任务.如果定时任务比较轻便,可以考虑使用JDK自带的定时任务Timer,如果定时任务很复杂,可以考虑使用quartz,我觉得spring自带的定时任务就像一个轻便型的quartz,在此篇博客中,只讨论spring自带的定时任务.
二. 七子表达式
首先,定时任务要知道一个东西,专业术语叫七子表达式(Cron),他与UNIX的Cron相类似,但是UNIX的Cron只能精确到分,而spring和quartz的Cron可以支持到秒.七子表达式,名字由来应该是他有七个域,每一个域代表着自己特殊的含义.
七个作用域
名称 | 必须 | 合法值 | 占位符 |
秒 | 是 | 0~59 | * - , / |
分 | 是 | 0~59 | * - , / |
时 | 是 | 0~23 | * - , / |
日 | 是 | 0~31 | * ? - , / L W |
月 | 是 | 1~12 或者 JAN~DEC | * - , / |
周 | 是 | 1~7 或者 SUN~SAT | * ? - , / L # |
年 | 否 | 空 或者 1970~2099 | * - , / |
占位符
符号 | 作用域 | 含义 | 示例 | 解析 |
* | 全部 | 该域上所有合法的值 | 0 0 9 * * ? | 每天9点 |
? | 日和周 | 无视该域上的值 | 同上 | 同上 |
- | 全部 | 该域上指定值的范围 | 0 0 9-17 * * ? | 每天9点至17点的整点 |
, | 全部 | 该域上指定值的集合列表 | 0 0 9,12,17 * * ? | 每天9点12点和17点 |
/ | 全部 | 该域上时间表的递增 | 0 0/15 * * * ? | 每刻钟 |
L | 日和周 | 该域上最后一个合法值 | 0 0 9 ? * 2L | 每个月最后一个星期一的9点 |
W | 日 | 该域上指定日期的最近一个工作日 | 0 0 9 15W * ? | 每个月离15号最近的工作的的9点 |
# | 周 | 该域上的第几个星期的星期几 | 0 0 9 ? * 6#4 | 每个月的第四个星期五 |
三. 代码演示
定时任务类:
package com.yczuoxin.demo.config;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
public class ScheduledTask {
private static final SimpleDateFormat FORMAT = new SimpleDateFormat("HH:mm:ss");
// 每5s触发一次定时任务
@Scheduled(fixedRate = 5000)
public void printTime(){
System.out.println("当前时间为: " + FORMAT.format(new Date()));
}
// 每天19点准时触发定时任务
@Scheduled(cron = "0 0 19 ? * *")
public void toTime(){
System.out.println("指定时间: " + FORMAT.format(new Date()));
}
}
可以看到@Scheduled有几种定时任务可供选择:
cron: 表示用七子表达式表示
zone: cron所运行的时区
fixedDelay: 从上一个任务完成后等待多长时间执行(ms)
fixedRate: 从上一个任务开始后等待多长时间执行(ms)
initialDelay: 等待长时间后开始执行(ms)
后面带String是用配置文件来读取内容信息,即相应的配置版本.
配置类:
package com.yczuoxin.demo.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
@Configuration
@ComponentScan("com.yczuoxin.demo.config")
/** 开启对任务的支持 */
@EnableScheduling
public class TaskConfig {
}
测试类:
package com.yczuoxin.demo.config;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TaskTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskConfig.class);
}
}
运行结果:
从结果可见,定时任务启动成功.