定時任務 Quartz Cron表示式
阿新 • • 發佈:2018-12-19
cron最初是unix中基於時間的作業排程程式。 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()));
}
}
啟動應用後,輸出如下所示: