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

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

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

    隨筆 - 170  文章 - 536  trackbacks - 0
    <2007年8月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    常用鏈接

    我參與的團隊

    隨筆分類(103)

    搜索

    •  

    積分與排名

    • 積分 - 415101
    • 排名 - 135

    最新評論

    閱讀排行榜

    Quartz 是一個強大的企業(yè)級 Schedule 工具,也是目前最好的開源 Schedule 工具,最近因為項目的需要,簡單的用到了 Quartz 的一些功能,對項目中使用 Quartz 的一些問題做簡單的記錄。

    在 Quartz 的應用中,我們用到了以下的一些東西,ScheduleFactory, Scheduler, Job, JobDetail, Trigger,簡單說明一下他們的用途。

    SchedulerFactory 是 Scheduler 的工廠,我們可以從中獲得受工廠管理的 Scheduler 對象。

    SchedulerFactory scheduleFactory = new StdSchedulerFactory();
    Scheduler scheduler = scheduleFactory.getScheduler();

    Scheduler 是一個計劃集,其中可以包含多個 JobDetail 和 Trigger 組成的計劃任務。
    我們可以從 SchedulerFactory 中取得 Scheduler。

    接口Job是每個業(yè)務上需要執(zhí)行的任務需要實現(xiàn)的接口,該接口只有一個方法:

    public interface Job {
        public void execute(JobExecutionContext context)
            throws JobExecutionException;
    }

    我們可以在里面定義我們的 Job 執(zhí)行邏輯,比如清除過期數(shù)據(jù),更新緩存等。

    JobDetail描述了一個任務具體的信息,比如名稱,組名等等。
    JobDetail jobDetail = new JobDetail("SayHelloWorldJob", Scheduler.DEFAULT_GROUP, SayHelloWorldJob.class);
    在上面的構造方法中,第一個是任務的名稱,第二個是組名,第三個就是實際當任務需要執(zhí)行的回調類。

    Trigger顧名思義就是觸發(fā)器,Quartz有個很好的想法就是分離了任務和任務執(zhí)行的條件。Trigger就是控制任務執(zhí)行條件的類,當Trigger認為執(zhí)行條件滿足的時刻,Trigger會通知相關的Job去執(zhí)行。分離的好處是:
    1.你可以為某個Job關聯(lián)多個Trigger,其中任何一個條件滿足都可以觸發(fā)job執(zhí)行,這樣可以完成一些組合的高級觸發(fā)條件
    2.當Trigger失效后(比如:一個永遠都不能滿足的條件),你不必去聲明一個新的job,代替的是你可以為job關聯(lián)一個新的Trigger讓job可以繼續(xù)執(zhí)行。

    目前的Quartz實現(xiàn)中,存在兩種Trigger,SimpleTrigger和CronTrigger,SimpleTrigger用來完成一些比如固定時間執(zhí)行的任務,比如:從現(xiàn)在開始1分鐘后等等;而CronTrigger(沒錯,和unix的cron進程的含意一樣)用來執(zhí)行calendar-like的任務,比如:每周五下午3:00,每月最后一天等等。

    在我們項目中,都是一些固定時間的 Job,所以只用到了 SimpleTrigger。
    Trigger trigger = new SimpleTrigger("SayHelloWorldJobTrigger",Scheduler.DEFAULT_GROUP,new Date(),null,0,0L);
    這個構造方法中,第一個是Trigger的名稱,第二個是Trigger的組名,第三個是任務開始時間,第四個是結束時間,第五個是重復次數(shù)(使用SimpleTrigger.REPEAT_INDEFINITELY常量表示無限次),最后一個是重復周期(單位是毫秒),那么這樣就創(chuàng)建了一個立刻并只執(zhí)行一次的任務。

    但我們定義好了 JobDetail,Job,和 Trigger 后,就可以開始 Schedule 一個 Job 了。

    scheduler.scheduleJob(jobDetail, trigger);

    這條語句就是把job和Trigger關聯(lián),這樣當Trigger認為應該觸發(fā)的時候就會調用(實際上是Scheduler調用)job.execute方法了。

    scheduler.start();
    千萬別忘了加上上面的語句,這條語句通知Quartz使安排的計劃生效。

    關于execute方法的參數(shù)JobExecutionContext
    JobExecutionContext就和很多Context結尾的類功能一樣,提供的運行時刻的上下文環(huán)境,JobExecutionContext中有Scheduler,JobDetail,Trigger等很多對象的引用,從而當你在execute方法內部須需要這些對象的時刻提供的便利。

    在項目中,我們把需要執(zhí)行的 Job 相對應的一些信息放在 JobExecutionContext 中,在 Job 執(zhí)行的時候可以調用。

    jobDetail.getJobDataMap().put(userid, id);

    在 Job 中,我們可以拿到相關的 Context 信息:

    jobExecutionContext.getJobDetail().getJobDataMap().getInt(userid);

    JobDetail和Trigger的name和group
    Scheduler實例對應了很多job和trigger的實例,為了方便的區(qū)分,Quartz使用name和group這兩個特性,正如你想向的一樣,同一個group下不能有兩個相同name的JobDetail,Trigger同理,同一個Scheduler下不能有兩個相同group的JobDetail,Trigger同理,JobDetail和Trigger的完全限定名為:group + name

    為了讓服務器重啟以后,我們的 Scheduler 信息仍然不丟失,我們通常采用數(shù)據(jù)庫持久化 Scheduler 的信息。
    DBScript 在 Quartz 的下載包中的:quartz-1.6.0\docs\dbTables 下,選擇自己使用的 DB 相應的 Script 導入數(shù)據(jù)庫就可以了。
    在應用中,我們需要配置一個 quartz.properties 才能正常使用 DB。我們可以在 quartz-1.6.0\examples\example10 中找到該文件的樣例,稍作一些修改,就可以放到自己項目源碼的根目錄下使用了。

    設置 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX 即可啟用基于 JDBC 的 Quartz 信息持久化。

    根據(jù)項目情況設置以下配置信息:
    org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
    org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
    org.quartz.jobStore.useProperties = false
    org.quartz.jobStore.dataSource = myDS
    org.quartz.jobStore.tablePrefix = QRTZ_
    org.quartz.jobStore.isClustered = false

    org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
    org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/myapplication
    org.quartz.dataSource.myDS.user = root
    org.quartz.dataSource.myDS.password =
    org.quartz.dataSource.myDS.maxConnections = 5

    但是光設置了 Database 不夠,我們還需要在 Application 啟動的時候自動啟動 Scheduler 才行,我們只需要簡單的寫一個 Servlet 的 Listener 并在 web.xml 中聲明該 Listener ,在 Servlet 容易啟動的時候,Scheduler 就開始自動執(zhí)行。

    public class ScheduleStartListener implements ServletContextListener {
        public void contextInitialized(ServletContextEvent servletContextEvent) {
            try {
               scheduleFactory.getScheduler().start();
            } catch (SchedulerException e) {
               // write log
            }
        }

        public void contextDestroyed(ServletContextEvent servletContextEvent) {
            try {
               scheduleFactory.getScheduler().shutdown();
            } catch (SchedulerException e) {
               // write log
            }
        }
    }

    在 web.xml 里面加入以下配置:
    <listener>
        <listener-class>org.agilejava.scheduler.ScheduleStartListener</listener-class>
    </listener>

    以上簡單的記錄了在項目中關于 Quartz 的一些應用,如果有什么新的使用心得,會在后面繼續(xù)加入的。

    posted on 2007-08-02 16:28 steady 閱讀(3570) 評論(4)  編輯  收藏 所屬分類: Java

    FeedBack:
    # re: Quartz 項目應用筆記 2007-11-07 09:35 傳智播客
    老師,您好!
      我是傳智播客的工作人員,負責csdn專家課堂的聯(lián)絡工作,我看了您的BLOG,能夠感受到您的實戰(zhàn)經(jīng)驗非常豐富,對Quartz 有非常深入的研究,我們真誠希望與您能夠結交成朋友,希望您加盟我們的專家教師團隊,尋找一些合作機會,我們的網(wǎng)址是www.itcast.cn,聯(lián)系郵箱itcast (at) itcast.cn。
      盼您早日回復,謝謝!
      回復  更多評論
      
    # re: Quartz 項目應用筆記 2008-04-13 11:19 天天
    請教高手:
    當任務完成時,會返回一個JobCompletionCode ,請問怎么樣才能得到這個JobCompletionCode???
    現(xiàn)在急用,敬請高手指教!
      回復  更多評論
      
    # re: Quartz 項目應用筆記[未登錄] 2008-07-01 21:14 風雨
    不錯。就是在講得深一點就好了!  回復  更多評論
      
    # re: Quartz 項目應用筆記 2008-09-23 14:30 Stringle
    高手,你好!
    請問,能否以文件的形式來保存任務的信息嗎?能否深入的介紹Quartz嗎?
    謝謝!  回復  更多評論
      
    主站蜘蛛池模板: 最新黄色免费网站| 亚洲VA中文字幕不卡无码| 亚洲国产精品免费视频| 性感美女视频免费网站午夜| 日韩中文字幕免费视频| 丁香六月婷婷精品免费观看| 亚洲色成人网站WWW永久四虎 | 亚洲人成无码网站在线观看| 久久香蕉国产线看观看亚洲片| 亚洲精品tv久久久久| 在线成人a毛片免费播放| 四虎在线最新永久免费| 久久免费高清视频| 久久国产美女免费观看精品| 婷婷国产偷v国产偷v亚洲| 精品久久久久久亚洲精品| 精品亚洲A∨无码一区二区三区| 亚洲精品国产精品乱码不99| 亚洲日本在线观看视频| 四虎影院永久免费观看| 精品国产免费一区二区| 女人18一级毛片免费观看| 日韩中文字幕精品免费一区| 最近2018中文字幕免费视频 | 亚洲人成人一区二区三区| 免费v片在线观看无遮挡| 国产精品二区三区免费播放心 | 亚洲人片在线观看天堂无码| 国产精品亚洲片夜色在线| 亚洲精品视频在线看| 国产小视频在线观看免费| 国产无遮挡吃胸膜奶免费看视频| 国产精品免费观看久久| 大地资源免费更新在线播放| 丁香花免费高清视频完整版| 一个人免费高清在线观看| 无码人妻一区二区三区免费 | 最新亚洲精品国偷自产在线 | 免费高清在线爱做视频| 色吊丝最新永久免费观看网站| 免费黄色网址入口|