Quartz入門例子簡介 從入門到菜鳥(三)

前面兩個博客講的都是簡單觸發器,直接傳入一個時間讓任務執行,這一話講CronTrigger的例子。

CronTrigger也是Quartz最重要的特點之一,經過Quartz特有的Cron表達式來肯定某類時間,能完成相似"每月二十號XXX,每一個星期三XXX"之類的任務。

先對MyJob作個小的修改,時間用中文來輸出,否則看起來太費勁,邏輯上沒有任何修改。
 javascript

Java代碼java

 收藏代碼

  1. public class MyJob implements Job {  
  2.     @Override  
  3.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  4.         String jobName = context.getJobDetail().getKey().getName();  
  5.         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");  
  6.         System.out.println("任務Key:" + jobName + " 正在執行,執行時間: " + dateFormat.format(Calendar.getInstance().getTime()));  
  7.     }  
  8. }  



接下來建立QuartzCronTest.java,這裏採用了CronTrigger做爲觸發器,注意NOTICE註釋下面的代碼:
 app

Java代碼ide

 收藏代碼

  1. public class QuartzCronTest {  
  2.   
  3.     public static void main(String[] args) throws Throwable {  
  4.         SchedulerFactory factory = new StdSchedulerFactory();  
  5.         Scheduler scheduler = factory.getScheduler();  
  6.   
  7.         JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();  
  8.         // @NOTICE  
  9.         // 與SimpleTrigger對比:類不一樣了,如今的是Trigger的子類CronTrigger;withSchedule中的參數變爲CronScheduleBuilder了  
  10.         // CronScheduleBuilder能夠經過相似"0/13 * * * * ?"這種表達式來建立定時任務  
  11.         // 當前這個表達式的定義是每一個秒是13的倍數,或者是0的時候,都觸發任務  
  12.         CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")  
  13.                 .withSchedule(CronScheduleBuilder.cronSchedule("0/13 * * * * ?")).build();  
  14.   
  15.         scheduler.scheduleJob(job, trigger);  
  16.   
  17.         scheduler.start();  
  18.         try {  
  19.             // 等待60秒查看效果  
  20.             Thread.sleep(60L * 1000L);  
  21.         } catch (Exception e) {  
  22.         }  
  23.         scheduler.shutdown(true);  
  24.     }  
  25. }  
  26. /* 
  27. -------------------------------------- 
  28.     0 0 12 * * ?            天天12點觸發 
  29.     0 15 10 ? * *           天天10點15分觸發 
  30.     0 15 10 * * ?           天天10點15分觸發 
  31.     0 15 10 * * ? *         天天10點15分觸發 
  32.     0 15 10 * * ? 2005      2005年天天10點15分觸發 
  33.     0 * 14 * * ?            天天下午的 2點到2點59分每分觸發 
  34.     0 0/5 14 * * ?          天天下午的 2點到2點59分(整點開始,每隔5分觸發) 
  35.     0 0/5 14,18 * * ?       天天下午的 2點到2點59分(整點開始,每隔5分觸發) 天天下午的 18點到18點59分(整點開始,每隔5分觸發) 
  36.     0 0-5 14 * * ?          天天下午的 2點到2點05分每分觸發 
  37.     0 10,44 14 ? 3 WED      3月分每週三下午的 2點10分和2點44分觸發 
  38.     0 15 10 ? * MON-FRI     從週一到週五天天上午的10點15分觸發 
  39.     0 15 10 15 * ?          每個月15號上午10點15分觸發 
  40.     0 15 10 L * ?           每個月最後一天的10點15分觸發 
  41.     0 15 10 ? * 6L          每個月最後一週的星期五的10點15分觸發 
  42.     0 15 10 ? * 6L 2002-2005    從2002年到2005年每個月最後一週的星期五的10點15分觸發 
  43.     0 15 10 ? * 6#3         每個月的第三週的星期五開始觸發 
  44.     0 0 12 1/5 * ?          每個月的第一個中午開始每隔5天觸發一次 
  45.     0 11 11 11 11 ?         每一年的11月11號 11點11分觸發(光棍節) 
  46. -------------------------------------- 
  47.  */  



其實使用起來很簡單,把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

相關文章
相關標籤/搜索