quartz學習一--入門

一、概述
    1、簡介
       (1)、項目創立於1998年, 不間斷更新,活躍度高。

       (2)、純Java設計,設計用於JavaSE、JavaEE, 方便集成於:JVM、JMI

       (3)、官網
            http://www.quartz-scheduler.org/

       (4)、cron表達式輔助工具
            http://www.cronmaker.com/    

    2、功能
       (1)、核心概念
            scheduler                                --->        調度器

            trigger                                --->        觸發器

            job                                    --->        調度任務對象

            jobDetail                                --->        調度任務描述

            listener                                --->        調度監聽

            calendar                                --->        調度時間點

       (2)、支持集羣
            org.quartz.jobStore.isClustered

       (3)、支持任務恢復
            requestsRecovery

    3、示例
       // (1)、通過SchedulerFactory構建Scheduler對象  
       Scheduler sched = sf.getScheduler();  

       // (2)、聲明 CronTrigger 觸發器
       CronTrigger trigger = new CronTrigger("helloWorldTrigger", "cronGroup", "1/1 * * * * ?");  

       // (3)、聲明  JobDetail(將 job 等屬性賦值給JobDetail)
       JobDetail job = new JobDetail("helloWorldJob", Scheduler.DEFAULT_GROUP, HelloWorldJob.class);

       // (4)、工廠模式,組裝各個組件<JOB,Trigger>  
       sched.scheduleJob (job, trigger);  
 
       // (5)、start   
       sched.start();  

    4、流程圖
       (1)、創建調度工廠                            --->        工廠模式

       (2)、根據工廠取得調度器實例                        --->        工廠模式

       (3)、Builder模式構建子組件<Job,Trigger>                    --->        builder模式, 如JobBuilder、TriggerBuilder、DateBuilder

       (4)、通過調度器組裝子組件,調度器.組裝<子組件1,子組件2...>        --->        工廠模式

       (5)、調度器.start                            --->        工廠模式

二、入門(居於 Quartz 1.*)
    1、目錄結構和內容
       docs/api                                    --->        Quartz 框架的JavaDoc Api 說明文檔

       docs/dbTables                                --->        創建 Quartz 的數據庫對象的腳本

       docs/wikidocs                                --->        Quartz 的幫助文件,點擊 index.html 開始查看

       Examples                                    --->        多方面使用 Quartz 的例子Lib Quartz 使用到的第三方包

       src/java/org/quartz                            --->        使用 Quartz 的客戶端程序源代碼,公有 API

       src/java/org/quartz/core                            --->        使用 Quartz 的服務端程序源代碼,私有 API

       src/java/org/quartz/simpl                        --->        Quartz 提供的不衣賴於第三方產品的簡單實現

       src/java/org/quartz/impl                            --->        依賴於第三方產品的支持模塊的實現

       src/java/org/quartz/utils                        --->        整個框架要用到的輔助類和工具組件

       注:Quartz 框架包含許多的類和接口,它們分佈在大概 11 個包中。多數所要使用到的類或接口放置在 org.quartz 包中。這個包含蓋了 Quartz 框架的公有 API.

    2、Scheduler
       (1)、作用
            負責對用戶定義的所有任務進行調度的類

       (2)、SchedulerFactory                            --->        調度工廠
            a、StdSchedulerFactory
           Quartz默認的SchedulerFactory,依賴於屬性類(Properties)決定如何生產 Scheduler 實例

           properties加載順序:
           檢查 System.getProperty("org.quartz.properties") 中是否設置了別的文件名

           使用 quartz.properties 作爲要加載的文件名

           試圖從當前工作目錄中加載這個文件

           試圖從系統 classpath 下加載這個文件
           
           Quartz jar包中有一個默認的 quartz.properties 文件

            b、DirectSchedulerFactory
           對SchedulerFactory的直接實現, 通過它可以直接構建Scheduler、threadpool 等

           -- 最簡單  
           public void createScheduler(ThreadPool threadPool, JobStore jobStore);  

           -- 最複雜  
           public void createScheduler(String schedulerName, String schedulerInstanceId,ThreadPool threadPool, JobStore jobStore, String rmiRegistryHost, int rmiRegistryPort);  

       (3)、Scheduler
            a、啓動 Scheduler
           scheduler.start();
        
            b、銷燬 Scheduler
           scheduler.shutdown();

            c、StdScheduler
           Quartz默認的Scheduler

            d、RemoteScheduler
           帶有RMI功能的Scheduler

    3、Trigger
       (1)、作用
            描述觸發Job執行的時間觸發規則。

        調度類(Scheduler)在 特定時間 調用此類,再由trigger類調用指定的定時程序。

       (2)、SimpleTrigger
            a、作用
           用於按頻率調度 指定任務

            b、常用屬性
           jobDetail        --->        指定調度任務

           repeatInterval        --->        指定間隔時間

           repeatCount        --->        指定次數,默認無窮次

           startDelay        --->        指定延遲多少毫秒啓動調度,默認立即
           
           startTime        --->        指定某個時間點啓動調試,默認立即

       (3)、CronTriggerBean
            a、作用
           用於按時間點調度 指定任務;使用Linux的Cron表達式 定義時間規則,Cron表達式由6或7個由空格分隔的時間字段組成
           
            b、常用屬性
           jobDetail        --->        指定調度任務

           cronExpression        --->        指定重複執行的時間點

            c、cron表達式
           字段        允許值            允許的特殊字符

           秒        0-59            , - * /

           分        0-59            , - * /

           小時        0-23            , - * /

           日期        1-31            , - * ? / L W C

           月份        1-12 或者 JAN-DEC    , - * /

           星期        1-7 或者 SUN-SAT    , - * ? / L C #

           年(可選)        留空, 1970-2099    , - * /

           注:星期與日期不可同時指定。

            d、cron特殊字符
           *            --->        表示任意
           ?            --->        表示不設置
           -            --->        表達一個範圍
           ,            --->        表達一個列表值
           /            --->        x/y表達一個等步長序列,x爲起始值,y爲增量步長值
           L            --->        該字符只在日期和星期字段中使用,代表“Last”的意思
           W            --->        該字符只能出現在日期字段裏,表示離該日期最近的工作日
           LW組合            --->        在日期字段可以組合使用LW,它的意思是當月的最後一個工作日
           #            --->        該字符只能在星期字段中使用,表示當月某個工作日:  6#3表示當月的第三個星期五(6表示星期五,#3表示當前的第三個)
           C            --->        該字符只在日期和星期字段中使用,計劃所關聯的日期,如果日期沒有被關聯,則相當於日曆中所有日期:  5C在日期字段中就相當於日曆5日以後的第一天

       (4)、其他 Trigger(不同版本有不同扣展)
            DateIntervalTrigger                            --->        日期間隔觸發的Trigger

    4、JOB 接口                                    --->        調度任務接口
       (1)、作用
            觸發器在被觸發後進行的操作,可以指定任意一個類的某個方法。

       (2)、JobExecutionContext
            JOB上下文,保存着Trigger、 JobDetail 等信息

       (3)、定義的方法
            public void execute(JobExecutionContext context) throws JobExecutionException;

       (4)、JobDetail
            a、作用
           描述Job的實現類及其它相關的靜態信息。
           
            b、原理(看參見 "一、3、(3)")
           Quartz在每次執行Job時,都重新創建一個Job實例,所以它不直接接受一個Job的實例,相反它接收一個Job實現類,以便運行時通過newInstance()的反射機制實例化Job

            c、作用
           JobDetail不存儲Job的實例,但它允許你定義一個實例,JobDetail 又指向JobDataMap

           JobDetail持有Job的詳細信息,如它所屬的組,名稱等信息

       (4)、JobDataMap
            a、作用
           保存着任務實例的對象,並保持着他們狀態信息,它是Map接口的實現,即你可以往裏面put和get一些你想存儲和獲取的信息.

            b、使用
           JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();

           注: 在Quartz 1.5之後,JobDataMap在 Trigger 級也是可用的。
               實際使用中trigger級別有時取不到map中的值, 使用getMergedJobDataMap 可以獲取到

       (5)、StatefulJob
            a、作用
           代表有狀態的任務,該接口是一個沒有方法的標籤接口,其目的是讓Quartz知道任務的類型,以便採用不同的執行方案。
           
            b、與Job的區分
           無狀態任務在執行時擁有自己的JobDataMap拷貝,對JobDataMap的更改不會影響下次的執行。

           有狀態任務共享同一個JobDataMap實例,每次任務執行對JobDataMap所做的更改會保存下來,後面的執行可以看到這個更改,也即每次執行任務後都會對後面的執行發生影響。

           無狀態的Job可以併發執行,而有狀態的StatefulJob不能併發執行: 如果前次的StatefulJob還沒有執行完畢,下一次的任務將阻塞等待,直到前次任務執行完畢。

       (6)、原生Job實現
            org.quartz.jobs.FileScanJob                        --->        檢查某個指定文件是否變化,並在文件被改變時通知到相應監聽器的 Job
            org.quartz.jobs.FileScanListener                    --->        在文件被修改後通知 FileScanJob 的監聽器
            org.quartz.jobs.NativeJob                        --->        用來執行本地程序(如 windows 下 .exe 文件) 的 Job
            org.quartz.jobs.NoOpJob                        --->        什麼也不做。一些用戶甚至僅僅用它來導致一個監聽器的運行
            org.quartz.jobs.ee.mail.SendMailJob                    --->        使用 JavaMail API 發送 e-mail 的 Job
            org.quartz.jobs.ee.jmx.JMXInvokerJob                --->        調用 JMX bean 上的方法的 Job
            org.quartz.jobs.ee.ejb.EJBInvokerJob                --->        用來調用 EJB 上方法的 Job
       
       注:一個job可以對應多個Trgger , 一個Trigger只能對應一個job .



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