前面兩個博客講的都是簡單觸發器,直接傳入一個時間讓任務執行,這一話講CronTrigger的例子。
CronTrigger也是Quartz最重要的特點之一,經過Quartz特有的Cron表達式來肯定某類時間,能完成相似"每月二十號XXX,每一個星期三XXX"之類的任務。
先對MyJob作個小的修改,時間用中文來輸出,否則看起來太費勁,邏輯上沒有任何修改。
javascript
Java代碼java

- public class MyJob implements Job {
- @Override
- public void execute(JobExecutionContext context) throws JobExecutionException {
- String jobName = context.getJobDetail().getKey().getName();
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");
- System.out.println("任務Key:" + jobName + " 正在執行,執行時間: " + dateFormat.format(Calendar.getInstance().getTime()));
- }
- }
接下來建立QuartzCronTest.java,這裏採用了CronTrigger做爲觸發器,注意NOTICE註釋下面的代碼:
app
Java代碼ide

- public class QuartzCronTest {
-
- public static void main(String[] args) throws Throwable {
- SchedulerFactory factory = new StdSchedulerFactory();
- Scheduler scheduler = factory.getScheduler();
-
- JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();
- // @NOTICE
- // 與SimpleTrigger對比:類不一樣了,如今的是Trigger的子類CronTrigger;withSchedule中的參數變爲CronScheduleBuilder了
- // CronScheduleBuilder能夠經過相似"0/13 * * * * ?"這種表達式來建立定時任務
- // 當前這個表達式的定義是每一個秒是13的倍數,或者是0的時候,都觸發任務
- CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
- .withSchedule(CronScheduleBuilder.cronSchedule("0/13 * * * * ?")).build();
-
- scheduler.scheduleJob(job, trigger);
-
- scheduler.start();
- try {
- // 等待60秒查看效果
- Thread.sleep(60L * 1000L);
- } catch (Exception e) {
- }
- scheduler.shutdown(true);
- }
- }
- /*
- --------------------------------------
- 0 0 12 * * ? 天天12點觸發
- 0 15 10 ? * * 天天10點15分觸發
- 0 15 10 * * ? 天天10點15分觸發
- 0 15 10 * * ? * 天天10點15分觸發
- 0 15 10 * * ? 2005 2005年天天10點15分觸發
- 0 * 14 * * ? 天天下午的 2點到2點59分每分觸發
- 0 0/5 14 * * ? 天天下午的 2點到2點59分(整點開始,每隔5分觸發)
- 0 0/5 14,18 * * ? 天天下午的 2點到2點59分(整點開始,每隔5分觸發) 天天下午的 18點到18點59分(整點開始,每隔5分觸發)
- 0 0-5 14 * * ? 天天下午的 2點到2點05分每分觸發
- 0 10,44 14 ? 3 WED 3月分每週三下午的 2點10分和2點44分觸發
- 0 15 10 ? * MON-FRI 從週一到週五天天上午的10點15分觸發
- 0 15 10 15 * ? 每個月15號上午10點15分觸發
- 0 15 10 L * ? 每個月最後一天的10點15分觸發
- 0 15 10 ? * 6L 每個月最後一週的星期五的10點15分觸發
- 0 15 10 ? * 6L 2002-2005 從2002年到2005年每個月最後一週的星期五的10點15分觸發
- 0 15 10 ? * 6#3 每個月的第三週的星期五開始觸發
- 0 0 12 1/5 * ? 每個月的第一個中午開始每隔5天觸發一次
- 0 11 11 11 11 ? 每一年的11月11號 11點11分觸發(光棍節)
- --------------------------------------
- */
其實使用起來很簡單,把Trigger的傳入「升級」爲CronTrigger就能夠了,經過CronScheduleBuilder把"0 0 12 * * ?"這樣的Cron表達式傳入CronTrigger當中,任務就能夠在指定的時間自動執行啦。
下面着重介紹一下Cron表達式,我的認爲上面列出來的足夠使用了,若是有進階需求的話,須要先對Cron表達式中的結構和符號有必定了解:
ui
Quartz Cron 表達式支持到七個域 |
名稱 |
是否必須 |
容許值 |
特殊字符 |
秒 |
是 |
0-59 |
, - * / |
分 |
是 |
0-59 |
, - * / |
時 |
是 |
0-23 |
, - * / |
日 |
是 |
1-31 |
, - * ? / L W |
月 |
是 |
1-12 或 JAN-DEC |
, - * / |
周 |
是 |
1-7 或 SUN-SAT |
, - * ? / L # |
年 |
否 |
空 或 1970-2099 |
, - * / |
首先,結構,以這個爲例spa
引用.net
0 11 11 11 11 ? 每一年的11月11號 11點11分觸發(光棍節)orm
能夠看到基本結構是 秒_分_小時_日_月_[周]_[年] 後面的周和年是可選的
其次,通配符,主要的有星號(*);問號(?);減號(-);逗號(,);斜槓(/);L字母;W字母;井號(#).
blog
- 星號:表示任意時刻
- 問號:只能在日或周字段上使用,http://blog.csdn.net/chh_jiang/article/details/4603529 這裏有比較清晰的解釋,簡單的理解就是日期和星期是有衝突的,指定其中一個的話,另一個是沒辦法指定的,好比每月12號和每一個星期二,這兩個是"互斥"的,不能用日期和周來指定全部「每一個是星期二的12號」這個時間。
- 減號:範圍,如 1-5秒
- 逗號:列表,如 1,5,10 秒
- 斜槓:等步長序列,如3/13秒 表示 3,16,29,42,55,3,16...
- L:僅在日和週上支持,表示容許的最後一個值,注意不要讓範圍和列表與L連用
- W:工做日
- 井號:爲給定月份指定具體的工做日實例。把「MON#2」放在周內日期字段中,表示把任務安排在當月的第二個星期一。
井號和L W用的比較少,其實簡單實用的話,根據那些註釋中的去改就夠了~~ip