我們接着來學習Quartz的日曆調度:
CronTrigger的作用:
基於 日曆 的 作業調度器, 而不像 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 | , - * / |
特殊字符的註釋:
符號 | 註釋 |
---|---|
* | 表示所有值, 例如:在分的字段上設置'*',表示每一分鐘都會觸發; |
? | 表示不指定值,使用的場景爲不需要關心當前設置這個字段的值,例如需要在每月的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.jsp
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;
示例:
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🇲🇲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();
}
}