任务调度是指给定时间点,给定时间间隔或给定执行次数自动执行任务。通常使用cron表达式来指定任务触发时机,在此简单了解下cron表达式的规则。cron表达式是由空格分隔的6或7个域组成的字符串。域中可以包含任何允许的值以及含有特殊字符的组合值。
cron表达式可以有如下两种格式(实际使用中为了简便大多使用6位):
Seconds Minutes Hours Dayofmonth Month Dayofweek
Seconds Minutes Hours Dayofmonth Month Dayofweek Year
这些域如下所示:
域 | 是否必须 | 允许的值 | 允许的特殊字符 |
---|---|---|---|
秒(Seconds) | 是 | 0-59 | , - * / |
分(Minutes) | 是 | 0-59 | , - * / |
时(Hours) | 是 | 0-23 | , - * / |
一个月中的某天(Day of month) | 是 | 1-31 | , - * ? / L W |
月(Month) | 是 | 1-12 or JAN-DEC | , - * / |
一周中的某天(Day of week) | 是 | 1-7 or SUN-SAT | , - * ? / L # |
年(Year) | 否 | 空值, 1970-2099 | , - * / |
各特殊字符含义:
- * 用于匹配该域的任意值,例: * 在Minutes域表示每分钟会触发事件
- ? 只能在Day of month和Day of week使用并且二者相互影响,例:需要在每月15号触发调度,而不管15号是星期几,则只能用 0 0 0 15 * ?
- - 用于指定范围,例: 10-12 在Hours域表示10点、11点、12点分别触发一次事件
- , 用于指定枚举值,例: 10,20 在Minutes域表示10分钟、20分钟分别触发一次事件
- / 表示开始时间触发后,每隔固定时间触发一次,例: 5/20 在Minutes域表示从第5分钟开始,每隔20分钟触发一次事件,即5分钟、25分钟、45分钟触发
- L 表示最后(last),例:L在Day of month域中表示最后一天——1月31日、非闰年的2月28日;单独的L在Day of week域中表示星期六,但如果在其它数字后表示一个月中最后的星期X——6L在Day of week域中表示一个月中最后的星期五,L-3在Day of week域中表示一个月中的最后3天
- W 用于指定最接近给定日期的工作日(weekday),例:15W在Day of month域中表示,如果15号是星期六,则会在最近的工作日星期五即14号触发;如果15号是星期日,则会在最近的工作日星期一即16号触发;如果15号是星期一至星期五中的某一天,则就在15号触发;若使用1W,而1号是星期六,则会在3号触发,W工作日的寻找不会发生跨月;LW表示每个月最后的工作日
- # 用于指定每个月第几个星期几,例:6#3在Day of week域中表示某个月第三个星期五,当使用4#5时,如果当月不存在第五周则事件在当月不会被触发
spirng中应用定时任务的例子:每隔5秒打印当前时间
@Component
@EnableScheduling
public class ScheduledTasks {
private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(cron = "*/5 * * * * ?")
public void reportCurrentTime() {
log.info("The time now is {}", dateFormat.format(new Date()));
}
}
启动应用后,输出如下所示:
参考:
http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger.html