<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    yxhxj2006

    常用鏈接

    統計

    最新評論

    Quartz 框架快速入門(一)

    創建一個 Java 工程,引入幾個 JAR 到工程中才能成功構建它們。首先,你需要 Quartz 的二進制版本,包的名字是 quartz-<version>.jar。Quartz 還需要幾個第三方庫;這依賴于你要用到框架的什么功能而定,Commons Digester 庫可以在<QUARTZ_HOME>/lib/core 和 <QUARTZ_HOME>/lib/optional 目錄中找到。如果出現java.lang.NoClassDefFoundError: javax/transaction/UserTransaction的錯誤,解決辦法是:引入jta.jar包,這個包在quartz-1.6.0/lib/build 下。
    ·創建一個 Quartz Job 類
    每一個 Quartz Job 必須有一個實現了 org.quartz.Job 接口的具體類。這個接口僅有一個要你在 Job 中實現的方法,execute(),方法 execute() 的原型如下:
    public void execute(JobExecutionContext context) throws JobExecutionException;
    當 Quartz 調度器確定到時間要激發一個 Job 的時候,它就會生成一個 Job 實例,并調用這個實例的 execute() 方法。調度器只管調用 execute() 方法,而不關心執行的結果,除了在作業執行中出問題拋出的 org.quartz.JobExecutionException 異常。
    下面是我們的第一個 Quartz job,它被設計來掃描一個目錄中的文并顯示文件的詳細信息.
    package com.vista.quartz;

    import java.io.File;       

    import java.io.FileFilter;

    import java.util.Date;       

          

    import org.apache.commons.logging.Log;       

    import org.apache.commons.logging.LogFactory;       

    import org.quartz.Job;       

    import org.quartz.JobDataMap;       

    import org.quartz.JobDetail;       

    import org.quartz.JobExecutionContext;       

    import org.quartz.JobExecutionException;  



    public class ScanDirectoryJob implements Job 

    {

        static Log logger = LogFactory.getLog(ScanDirectoryJob.class);//日志記錄器

        

        public void execute(JobExecutionContext context) throws JobExecutionException 

        {

            //Every job has its own job detail       

            JobDetail jobDetail = context.getJobDetail();       

            // The name is defined in the job definition       

            String jobName = jobDetail.getName();//任務名稱       

            
    // Log the time the job started       

            logger.info(jobName + " fired at " + new Date());//記錄任務開始執行的時間       

            
    // The directory to scan is stored in the job map       

            JobDataMap dataMap = jobDetail.getJobDataMap();//任務所配置的數據映射表       

            String dirName = dataMap.getString("SCAN_DIR");//獲取要掃描的目錄       

            
    // Validate the required input       

            if (dirName == null

            {//所需要的掃描目錄沒有提供       

                 throw new JobExecutionException( "Directory not configured" );       

            }       

            // Make sure the directory exists       

            File dir = new File(dirName);       

            if (!dir.exists()) 

            {//提供的是錯誤目錄       

                throw new JobExecutionException( "Invalid Dir "+ dirName);       

            }       

            // Use FileFilter to get only XML files       

            FileFilter filter = new FileExtensionFileFilter(".xml");       

            //只統計xml文件

            File[] files = dir.listFiles(filter);       

            if (files == null || files.length <= 0) 

            {//目錄下沒有xml文件       

                logger.info("No XML files found in " + dir);       

                // Return since there were no files       

                return;

            }       

            // The number of XML files       

            int size = files.length;          

            // Iterate through the files found       

            for (int i = 0; i < size; i++) 

            {

                File file = files[i];       

                // Log something interesting about each file.       

                File aFile = file.getAbsoluteFile();       

                long fileSize = file.length();       

                String msg = aFile + " - Size: " + fileSize;       

                logger.info(msg);//記錄下文件的路徑和大小

            } 

        }

    }
    當 Quartz 調用 execute() 方法,會傳遞一個 org.quartz.JobExecutionContext 上下文變量,里面封裝有 Quartz 的運行時環境和當前正執行的 Job。通過 JobexecutionContext,你可以訪問到調度器的信息,作業和作業上的觸發器的信息,還有更多更多的信息。在代碼中,JobExecutionContext 被用來訪問 org.quartz.JobDetail 類,JobDetail 類持有 Job 的詳細信息,包括為 Job 實例指定的名稱,Job 所屬組,Job 是否被持久化(易失性),和許多其他感興趣的屬性。
    JobDetail 又持有一個指向 org.quartz.JobDataMap 的引用。JobDataMap 中有為指定 Job 配置的自定義屬性。例如,在代碼中我們從 JobDataMap 中獲得欲掃描的目錄名,我們可以在 ScanDirectoryJob 中硬編碼這個目錄名,但是這樣的話我們難以重用這個 Job 來掃描別的目錄了。在后面你將會看到目錄是如何配置到 JobDataMap 的。
    execute() 方法中剩下的就是標準 Java 代碼了:獲得目錄名并創建一個 java.io.File 對象。它還對目錄名作為簡單的校驗,確保是一個有效且存在的目錄。接著調用 File 對象的 listFiles() 方法得到目錄下的文件。還創建了一個 java.io.FileFilter 對象作為參數傳遞給 listFiles() 方法。org.quartzbook.cavaness.FileExtensionFileFilter 實現了 java.io.FileFilter 接口,它的作用是過濾掉目錄僅返回 XML 文件。默認情況下,listFiles() 方法是返回目錄中所有內容,不管是文件還是子目錄,所以我們必須過濾一下,因為我們只對 XML 文件感興趣。
    FileExtensionFileFilter 被用來屏蔽名稱中不含字符串 “.xml” 的文件。它還屏蔽了子目錄--這些子目錄原本會讓 listFiles() 方法正常返回。過濾器提供了一種很便利的方式選擇性的向你的 Quartz 作業提供它能接受的作為輸入的文件.
    package com.vista.quartz;

    import  java.io.File;       

    import  java.io.FileFilter;   



    public class FileExtensionFileFilter implements  FileFilter 

    {

         private  String extension;//文件后綴     

         

         public  FileExtensionFileFilter(String extension)

         {       

             this.extension = extension;

         }             

         public   boolean  accept(File file)

         {//只接受指定后綴的文件       

             
    // Lowercase the filename for easier comparison       

             String lCaseFilename = file.getName().toLowerCase();//小寫化

             return  (file.isFile() &&(lCaseFilename.indexOf(extension) >  0 )) ?  true : false ;       

         }       

    }
    到目前為止,我們已經創建了一個 Quartz job,但還沒有決定怎么處置它--明顯地,我們需以某種方式為這個 Job 設置一個運行時間表。時間表可以是一次性的事件,或者我們可能會安裝它在除周日之外的每個午夜執行。你即刻將會看到,Quartz Schduler 是框架的心臟與靈魂。所有的 Job 都通過 Schduler 注冊;必要時,Scheduler 也會創建 Job 類的實例,并執行實例的 execute() 方法。
    ·編程式安排一個 Quartz Job
    所有的要 Quartz 來執行的作業必須通過調度器來注冊。大多情況下,這會在調度器啟動前做好。正如前面說過,這一操作也提供了聲明式與編程式兩種實現途徑的選擇。
    因為每一個 Job 都必須用 Scheduler 來注冊,所以先定義一個 JobDetail,并關聯到這個 Scheduler 實例。
    下面的程序提供了一個理解如何編程式安排一個 Job 很好的例子。代碼首先調用 createScheduler() 方法從 Scheduler 工廠獲取一個 Scheduler 的實例。得到 Scheduler 實例之后,把它傳遞給 schedulerJob() 方法,由它把 Job 同 Scheduler 進行關聯。
    首先,創建了我們想要運行的 Job 的 JobDetail 對象。JobDetail 構造器的參數中包含指派給 Job 的名稱,邏輯組名,和實現 org.quartz.Job 接口的全限類名稱。我們可以使用 JobDetail 的別的構造器。
    在前面有說過,JobDetail 扮演著某一 Job 定義的角色。它帶有 Job 實例的屬性,能在運行時被所關聯的 Job 訪問到。其中在使用 JobDetail 時,的一個最重要的東西就是 JobDataMap,它被用來存放 Job 實例的狀態和參數。在代碼中,待掃描的目錄名稱就是通過  scheduleJob() 方法存入到 JobDataMap 中的。
    Job 只是一個部分而已。注意我們沒有在 JobDetail 對象中為 Job 設定執行日期和次數。這是 Quartz Trigger 該做的事。顧名思義,Trigger 的責任就是觸發一個 Job 去執行。當用 Scheduler 注冊一個 Job 的時候要創建一個 Trigger 與這個 Job 相關聯。Quartz 提供了四種類型的 Trigger,但其中兩種是最為常用的,它們就是在下面要用到的 SimpleTrigger 和  CronTrigger.
    SimpleTrigger 是兩個之中簡單的那個,它主要用來激發單事件的 Job,Trigger 在指定時間激發,并重復 n 次--兩次激發時間之間的延時為 m,然后結束作業。CronTrigger 非常復雜且強大。它是基于通用的公歷,當需要用一種較復雜的時間表去執行一個 Job 時用到。例如,四月至九月的每個星期一、星期三、或星期五的午夜。
    為更簡單的使用 Trigger,Quartz 包含了一個工具類,叫做 org.quartz.TriggerUtils. TriggerUtils 提供了許多便捷的方法簡化了構造和配置 trigger. 本文的例子中有用的就是 TriggerUtils 類;SimpleTrigger 和 CronTrigger 會在后面用到。
    正如你看到的那樣,調用了 TriggerUtils 的方法 makeSecondlyTrigger() 來創建一個每10秒種激發一次的 trigger(實際是由 TriggerUtils 生成了一個 SimpleTrigger 實例,但是我們的代碼并不想知道這些)。我們同樣要給這個 trigger 實例一個名稱并告訴它何時激發相應的 Job;與之關聯的 Job 會立即啟動,因為由方法 setStartTime() 設定的是當前時間
    package com.vista.quartz;



    import java.util.Date;       



    import org.apache.commons.logging.Log;       

    import org.apache.commons.logging.LogFactory;       

    import org.quartz.JobDetail;

    import org.quartz.Scheduler;       

    import org.quartz.SchedulerException;       

    import org.quartz.Trigger;

    import org.quartz.TriggerUtils;

    import org.quartz.impl.StdSchedulerFactory;



    public class SimpleScheduler 

    {

        static Log logger = LogFactory.getLog(SimpleScheduler.class);         

        public static void main(String[] args) 

        {       

             SimpleScheduler simple = new SimpleScheduler();       

             try

             {       

                 // Create a Scheduler and schedule the Job       

                 Scheduler scheduler = simple.createScheduler();       

                 simple.scheduleJob(scheduler);       

        

                 // Start the Scheduler running       

                 scheduler.start();       

        

                 logger.info( "Scheduler started at " + new Date());       

        

            } catch (SchedulerException ex) {       

                 logger.error(ex);       

            }   

            

        }       

        public Scheduler createScheduler() throws SchedulerException 

        {//創建調度器       

            return StdSchedulerFactory.getDefaultScheduler();

        }   

        

        //Create and Schedule a ScanDirectoryJob with the Scheduler       

        private void scheduleJob(Scheduler scheduler) throws SchedulerException 

        {       

             // Create a JobDetail for the Job       

             JobDetail jobDetail = new JobDetail("ScanDirectory",Scheduler.DEFAULT_GROUP,ScanDirectoryJob.class); 

             // Configure the directory to scan       

             jobDetail.getJobDataMap().put("SCAN_DIR","D:\\Tomcat\\conf"); //set the JobDataMap that is associated with the Job.            

             
    // Create a trigger that fires every 10 seconds, forever       

             Trigger trigger = TriggerUtils.makeSecondlyTrigger(10);//每10秒觸發一次       

             trigger.setName("scanTrigger");       

             // Start the trigger firing from now       

             trigger.setStartTime(new Date());//設置第一次觸發時間            

             
    // Associate the trigger with the job in the scheduler       

             scheduler.scheduleJob(jobDetail, trigger);       

        }       

    }
    假如你有不只一個個 Job (你也許就是),你將需要為每一個 Job 創建各自的 JobDetail。每一個 JobDetail 必須通過 scheduleJob() 方法一一注冊到 Scheduler 上。而如果你想重用了一個 Job 類,讓它產生多個實例運行,那么你需要為每個實例都創建一個 JobDetail。例如,假如你想重用 ScanDirectoryJob 讓它檢查兩個不同的目錄,你需要創建并注冊兩個 JobDetail 實例
    package com.vista.quartz;



    import java.util.Date;       



    import org.apache.commons.logging.Log;       

    import org.apache.commons.logging.LogFactory;       

    import org.quartz.JobDetail;

    import org.quartz.Scheduler;       

    import org.quartz.SchedulerException;       

    import org.quartz.Trigger;

    import org.quartz.TriggerUtils;

    import org.quartz.impl.StdSchedulerFactory;



    public class SimpleScheduler 

    {

        static Log logger = LogFactory.getLog(SimpleScheduler.class);         

        public static void main(String[] args) 

        {       

             SimpleScheduler simple = new SimpleScheduler();       

             try 

             {       

                 // Create a Scheduler and schedule the Job       

                 Scheduler scheduler = simple.createScheduler();         

                 // Jobs can be scheduled after Scheduler is running       

                 scheduler.start();          

                 logger.info("Scheduler started at " + new Date());         

                 // Schedule the first Job       

                 simple.scheduleJob(scheduler, "ScanDirectory1",ScanDirectoryJob.class,"D:\\conf1", 10);          

                 // Schedule the second Job       

                 simple.scheduleJob(scheduler, "ScanDirectory2",ScanDirectoryJob.class,"D:\\conf2 ", 15);       

            } 

            catch (SchedulerException ex)

            {       

                 logger.error(ex);       

            }       

        }       

        public Scheduler createScheduler() throws SchedulerException 

        {//創建調度器       

            return StdSchedulerFactory.getDefaultScheduler();

        }   

        

        private void scheduleJob(Scheduler scheduler, String jobName,Class jobClass, String scanDir, int scanInterval) throws SchedulerException 

        {         

            // Create a JobDetail for the Job       

           JobDetail jobDetail = new JobDetail(jobName,Scheduler.DEFAULT_GROUP, jobClass);         

           // Configure the directory to scan       

           jobDetail.getJobDataMap().put("SCAN_DIR", scanDir);         

           // Trigger that repeats every "scanInterval" secs forever       

           Trigger trigger = TriggerUtils.makeSecondlyTrigger(scanInterval);         

           trigger.setName(jobName + "-Trigger");         

           // Start the trigger firing from now       

           trigger.setStartTime(new Date());         

           // Associate the trigger with the job in the scheduler       

           scheduler.scheduleJob(jobDetail, trigger);       

      }       

    }



    posted on 2012-09-14 18:27 奮斗成就男人 閱讀(193) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 久久久久免费视频| 免费看的黄色大片| 亚洲色精品VR一区区三区| 日本免费福利视频| a级精品九九九大片免费看| 亚洲三级在线视频| 亚洲成av人在片观看| 国产精品99久久免费观看| 亚洲国产精品精华液| 久久精品国产亚洲| 浮力影院第一页小视频国产在线观看免费| 午夜在线免费视频| 亚洲小视频在线播放| 亚洲综合亚洲综合网成人| 国产精彩免费视频| 国产99久久久久久免费看| 亚洲a视频在线观看| 国产综合精品久久亚洲| 在线观看免费成人| 小草在线看片免费人成视久网| 国产亚洲精品第一综合| 亚洲熟妇av一区| 中文字幕不卡亚洲| 午夜神器成在线人成在线人免费| 国产拍拍拍无码视频免费| 老司机午夜免费视频| 亚洲午夜精品国产电影在线观看| 亚洲人成网站观看在线播放| 青青在线久青草免费观看| 久久精品成人免费观看97| 亚洲国产精品无码久久九九大片 | 国产一级理论免费版| 色欲国产麻豆一精品一AV一免费| 特级毛片全部免费播放a一级| 亚洲中文无码线在线观看| 亚洲av无码一区二区三区不卡| 亚洲国产高清精品线久久| 我要看WWW免费看插插视频| 91高清免费国产自产拍2021| 91国内免费在线视频| 无码毛片一区二区三区视频免费播放|