版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
public @interface Scheduled {
String cron() default "";
String zone() default "";
long fixedDelay() default -1;
String fixedDelayString() default "";
long fixedRate() default -1;
String fixedRateString() default "";
long initialDelay() default -1;
String initialDelayString() default "";
}
1.cron
cron表达式是一个字符串,以5或6个空格隔开,分为6或7个域,每一个域代表一个含义。
字段 | 允许值 | 允许的特殊符号 |
---|---|---|
秒 | 0-59 | ,-*/ |
分 | 0-59 | ,-*/ |
时 | 0-23 | ,-*/ |
日 | 1-31 | , - * / ? L W C |
月 | 1-12 | ,-*/ |
星期 | 0 - 7(0,7都是SUN) 或 SUN - SAT | , - * / ? L C # |
特殊字符解释
特殊字符 | 允许值 |
---|---|
, | 枚举 |
- | 区间 |
* | 任意 |
/ | 步长 |
? | 日和星期冲突匹配 |
L | 最后(Last) |
W | 工作日(weekday) |
C | 使用Calendar日历类计算得出的值 |
# | 星期匹配 |
举例
例 | 解释 |
---|---|
0 0/5 14,18 * * ? | 每天14点和18点整,每个5分钟执行1次 |
0 15 10 ? * 1-6 | 每个月的星期一至星期六10点15分执行1次 |
0 0 2 ? * 6L | 每个月最后一个星期六2点执行1次 |
0 0 2 LW * ? | 每个月的最后一个工作日2点执行1次 |
0 0 2-4 ? * 1#1 | 每个月的第一个星期一2点到4点,每个整点都执行1次 |
2. zone
时区,接收时区的ID值(java.util.TimeZone)。默认留空,即取服务器所在地时区。也可指定,一般使用的上海时区Asia/Shanghai。可使用如下代码获取时区ID列表:
String[] tz=TimeZone.getAvailableIDs();
System.out.println(Arrays.toString(tz));
结果为当前可用时区ID列表(部分):
Africa/Abidjan,
Africa/Accra,
Africa/Addis_Ababa,
Africa/Algiers,
Africa/Asmara,
Africa/Asmera,
Africa/Bamako,
...
3.fixedDelay和fixedDelayString
fixedDelay:上一次执行完毕后等待3秒再执行1次。
fixedDelayString:与fixedDelay类似,但是支持占位符,可在配置文件中配置。
@Scheduled(fixedDelay = 3000)
//配置:time.fixedDelayString=3000
@Scheduled(fixedDelayString = "${time.fixedDelayString}")
4.fixedRate和fixedRateString
fixedRate:上一次执行开始后等待3秒再执行1次。
fixedRateString:与fixedRate类似,但是支持占位符,可在配置文件中配置。
@Scheduled(fixedRate = 3000)
//配置:time.fixedRateString=3000
@Scheduled(fixedRateString = "${time.fixedRateString}")
5. initialDelay和initialDelayString
initialDelay:第一次延迟1秒后再执行,之后按fixedRate的规则每3秒执行一次。
initialDelayString:与 initialDelay类似,但是支持占位符,可在配置文件中配置。
@Scheduled(initialDelay=1000, fixedRate=3000)
配置:time.initialDelayString=1000
@Scheduled(initialDelayString=${time.initialDelayString}, fixedRate=3000)
测试
1.编写一个ScheduledService类,需要注意需要给类加入@Service注解,将它加入到SpringBoot的容器中。编写一个方法在控制台打印执行方法时当前的时间,来测试定时任务。
@Service
public class ScheduledService {
@Scheduled(cron = "* * * * * SUN-MON") //不能写为MON-SUN
public void hello(){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date=sdf.format(new Date());
System.out.println("定时任务执行:"+date);
}
}
2.在SpringBoot主程序类中开启允许定时任务。
@EnableScheduling
@SpringBootApplication
public class SpringBootScheduleTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootScheduleTestApplication.class, args);
}
}
3.运行程序,可以看到定时任务的执行,在控制台每秒打印一次信息。