JAVA基礎--Quartz定時任務調度的簡單應用(2)

我們接着來學習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();
    }
    
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章