任务调度之cron表达式

任务调度是指给定时间点,给定时间间隔或给定执行次数自动执行任务。通常使用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