咱們接着來學習Quartz的日曆調度:java
CronTrigger的做用:jsp
基於 日曆 的 做業調度器, 而不像 SimpleTrigger 那樣精確指定間隔時間,比SimpleTrigger更經常使用;
應用於每一個星期的星期幾進行調度,每月的幾號進行調度..等,這種複雜調度;函數
Cron表達式 : 工具
用於配置CronTrigger實例.
是由7個字表達式組成的字符串,描述了時間表的詳細信息.
格式: [秒] [分] [時] [日] [月] [周] [年]
特殊字符意義對應表:學習
字段 | 是否必填 | 容許值 | 容許的特殊字符 |
---|---|---|---|
秒 | 是 | 0~59 | , - * / |
分 | 是 | 0~59 | , - * / |
時 | 是 | 0~23 | , - * / |
日 | 是 | 1~31 | , - * / ? L W |
月 | 是 | 1~12或JAN~DEC | , - * / |
周 | 是 | 1~7或SUN~SAT | , - * / ? L # |
年 | 否 | empty,1970~2099 | , - * / |
特殊字符的註釋:ui
符號 | 註釋 |
---|---|
* | 表示全部值, 例如:在分的字段上設置'*',表示每一分鐘都會觸發; |
? | 表示不指定值,使用的場景爲不須要關心當前設置這個字段的值,例如須要在每個月的10號執行,但不關心是周幾;因此能夠在周的字段上設置'?'; |
- | 表示區間.例如在小時上設置'10-12',表示10,11,12小時都會執行; |
, | 表示多指定多個值: 例如在週上指定'MON,WED,FRI'表示週一,週三,週五都會執行; |
/ | 用於遞增觸發,如在秒上面設置"5/15"表示從5秒開始,每隔15秒觸發(5,20,35,50).在月上設置"1/3",每個月1號開始,每隔3天觸發一次; |
L | 表示最後的意思,在日上設置,表示當月最後一天(依據當前月份,若是是二月還依據當年是不是潤年);在周字段上表示是星期六,至關於7或SAT; 若是在L前加數字,則表示該數據的最後一個,在週上設置'6L',表示本月最後一個星期五; |
W | 表示離指定日期最近的那個工做日(週一至週五).例如在日上設置'15W',表示離每個月15號最近的那個工做日觸發.若是15號正好是週六,則14號週五觸發,若是15號是週日,則16號週一觸發;若是15號是工做日,則當天觸發; 設置爲'1W',則表示每個月一號後的工做日觸發,若是1號爲週六,則3號週一觸發;(注: W前只能設置具體的數字,不能設置區間); |
# | 序號,表示每個月的第幾個周幾, 在週上設置'6#3'表示在每個月的第三個週五, 注意: '#5',當沒有第五週的時候,不會觸發該配置; |
提示: L,W 能夠組合使用;
周字段英文字母不區分大小寫;
利用工具在線生成: http://www.pdtools.net/tools/becron.jspspa
StdSchedulerFactory :
(1), 使用一組參數(Java.util.Properties)來建立和初始化Quartz調度器;
(2), 配置參數通常存儲在quartz.properties中;
(3), 調用getScheduler方法就能建立和初始化調度器對象;
Scheduler的主要函數:
(1), Date scheduleJob(JobDetail jobDetail, Trigger trigger); 返回最近一次將要觸發的時間;
(2), void start(); 啓動;
(3), void standby(); 掛起; 繼續調用 start(),能夠喚醒;
(4), void shutdown(); 關閉,不能被喚醒;
shutdown(true):表示等待全部正在執行的Job執行完畢後,再關閉scheduler;
shutdown(false):表示直接關閉scheduler;
quartz.properties :
文檔的位置和加載順序: 優先讀取項目目錄下的quartz.properties文件;若是沒有,則讀jar包;
組成部分: (1), 調度器屬性; (2),線程池屬性; (3),做業存儲設施; (4),插件配置;
調度器屬性:
org.quartz.scheduler.instanceName屬性用來區分特定的調度器實例,能夠按照功能用途來給調度器起名.
org.quartz.scheduler.instanceId屬性和前者同樣,也容許任何字符串,但這個值必須是在全部調度器實例中是惟一的,尤爲是在一個集羣當中,做爲集羣的惟一Key.假如你想Quartz幫你生成這個值的話,能夠設置爲AUTO;.net
示例: 插件
package quartz; import java.text.SimpleDateFormat; import java.util.Calendar; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; /** *@description TODO CronTrigger日曆時間調度 *@date 2018/1/23 *@author geYang **/ public class HelloCronTrigger { public static void main(String[] args) throws Exception { Calendar calender = Calendar.getInstance(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob").build(); CronTrigger trigger = (CronTrigger)TriggerBuilder.newTrigger() .withIdentity("myTrigger") .withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 10 ? * *")) .build(); /** * Cron 表達式: * 用於配置CronTrigger實例.是由7個字表達式組成的字符串,描述了時間表的詳細信息.格式: [秒] [分] [時] [日] [月] [周] [年] * 例: * 1,每秒中執行: "* * * * * ? *" * 2,天天10點15分觸發: "0 15 10 ? * *" ; "0 15 10 * * *" * 3,天天下午的10:00~10:59,每隔五分鐘執行一次: "0 0/1 10 * * ?" * 4,週一到週五,天天上午10:15觸發: "0 15 10 ? * 2-6" ; "0 15 10 ? * MON-FRI" * 5,每個月的第三週的星期五的10:15觸發 : "0 15 10 ? * 6#3" (注: '6'=>星期五; '3'=>第三週 ; '6#3'=>第三週星期五) * 6,從2017年到2018年每個月最後一週的星期五的10:15分觸發: "0 15 10 ? * 6L 2017-2018" (注: '6'=>星期五; 'L'=>最後一週; "6L"=>最後一週的星期五) * 7,天天的 10:00~10:59以及 18:00~18:59每隔5秒執行一次: "0/5 * 10,18 * * ?" * */ // 建立 Scheduler 實例; SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); scheduler.scheduleJob(jobDetail, trigger); System.out.println("當前時間:"+sf.format(calender.getTime())); scheduler.start(); } }