1. 程式人生 > >定時任務 Quartz Cron表示式

定時任務 Quartz Cron表示式

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()));
	}

}

啟動應用後,輸出如下所示: