程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Quartz2.2.1教程 快速上手,quartz2.2.1教程

Quartz2.2.1教程 快速上手,quartz2.2.1教程

編輯:JAVA綜合教程

Quartz2.2.1教程 快速上手,quartz2.2.1教程


 一、初識quartz
 
  JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();
 
  Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startNow().build();
 
  Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  scheduler.scheduleJob(job, trigger);
  scheduler.start();
  scheduler.shutdown();
 
  認識quartz讀懂這幾行代碼就可以了。
 
  1.JobDetail是quartz的真正意義上的job,必須指定JobDetail的name,group屬性,這兩個屬性是JobDetail的唯一標識;
     其中HelloJob是一個implements Job的類,它是真正意義上我們的業務執行類,我們的任務邏輯實現寫在execute(JOB接口唯一的方法)的方法裡.
 
  2.Trigger是JobDetail的觸發器,JobDetail什麼時候觸發,觸發間隔,觸發次數都由它來指定;
     一個JobDetail可以被多個Trigger觸發.
   
  3.Scheduler將JobDetail和Trigger組合在一起進行工作,Scheduler只有調用start()的方法才會真正的啟動調度;
     Scheduler可以先start()啟動,再scheduleJob(JobDetail,Trigger);反之亦然,很好理解,因為調度框架啟動後就可以自動去調度任務.
   
 二、JobDetail,Trigger的更方便的生成方式
 
  quartz給我們提供了很多便捷的操作,最簡單的,靜態引入:
  import static org.quartz.JobBuilder.*;
  import static org.quartz.SimpleScheduleBuilder.*;
  import static org.quartz.CronScheduleBuilder.*;
  import static org.quartz.CalendarIntervalScheduleBuilder.*;
  import static org.quartz.TriggerBuilder.*;
  import static org.quartz.DateBuilder.*;
 
  這樣,newJob,newTrigger,cronSchedule等一系列方便的方法就可以直接使用了.因為quartz的CronTrigger幾乎可以滿足所有的開發需求,
  所以我的Trigger全部采用CronTrigger來實現,只需生成對應的cron表達式.
 
  三、細談Job,JobDetail
 
  一個簡單的Job如下,事實上復雜的也是這樣,只是區別於execute方法體:
  public class HelloJob implements Job {
    public HelloJob() {}
    public void execute(JobExecutionContext context) throws JobExecutionException{
      System.err.println("Hello!  HelloJob is executing.");
    }
  }
 
  如果你想給JobDetail傳入參數,可以獲取dataMap,並向其中隨意put,建議所有屬性都為String類型:
  jobDetail.getJobDataMap().put(JOB_DATA_KEY, JSONObject.toJSONString(Object));
 
  如果你想給Trigger傳入參數,同樣可以獲取dataMap,不過這是JobDetail的,要知道trigger本身不需要任何參數,都是為JobDetail服務:
  trigger.getJobDataMap().put(JOB_DATA_KEY, JSONObject.toJSONString(Object));
 
  這樣在你的execute方法裡你就可以獲取剛剛添加的所有參數,建議獲取所有的:
  context.getMergedJobDataMap().getString("paramName");
 
  四、監聽Trigger,監聽JobDetail
 
  很簡單
  1.創建自己的Listener:
  public class McTriggerListener extends TriggerListenerSupport
  public class McJobListener extends JobListenerSupport
 
  2.scheduler獲取ListenerManager添加自己的listener即可:
  scheduler.getListenerManager().addJobListener(mcJobListener, allJobs());
  scheduler.getListenerManager().addTriggerListener(triggerListener);
 
  因為我需要記錄任務執行成功失敗,記錄成功失敗條數,失敗原因,執行完成後更新狀態,所以這裡先將監聽器擺出來,監聽器的順序:
 
  TriggerListenerSupport.triggerFired-->JobListenerSupport.jobToBeExecuted-->Job.execute-->JobListenerSupport.jobWasExecuted
  -->TriggerListenerSupport.triggerComplete
 
  這樣你就可以隨意的統計,或者在任務執行前後做自己想做的事情,我覺得這是很重要的.
 
  五、將quartz引入web項目
 
  1.如果web項目不將quartz的Scheduler先實例化並啟動,那麼quartz的生命周期將無法與web容器同步,導致的結果就是項目停了任務還在繼續跑,項目起了任務
    不執行,還需要人工執行start()方法,我這裡沒有用spring,在web.xml中初始化:
    <!-- Quartz -->
    <servlet>
        <servlet-name>QuartzInitializer</servlet-name>
        <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
        <init-param>
            <param-name>config-file</param-name>
            <param-value>/quartz.properties</param-value>
        </init-param>
        <init-param>
            <param-name>shutdown-on-unload</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    
  2.當然了你需要配置quartz的屬性文件,扔到maven的resources下即可,很簡單如下:
    org.quartz.scheduler.instanceName: MainScheduler     //實例名稱
    org.quartz.scheduler.instanceId: instance_one        //實例Id,集群時請設置不同的Id

    org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool     //使用quartz線程池
    org.quartz.threadPool.threadCount = 10
    org.quartz.threadPool.threadPriority = 5
    org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

    org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX     //使用數據庫持久化
    org.quartz.jobStore.tablePrefix = QRTZ_   //表前綴,所需要的表在quartz下載的包中可以找到
    org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
    org.quartz.jobStore.dataSource = qzDS     //數據源
    org.quartz.jobStore.useProperties=true    //參數類型只能為String
    org.quartz.jobStore.isClustered=false     //是否集群

    org.quartz.dataSource.qzDS.driver = com.mysql.jdbc.Driver
    org.quartz.dataSource.qzDS.URL = jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=utf-8
    org.quartz.dataSource.qzDS.user = root
    org.quartz.dataSource.qzDS.password = 123456
    org.quartz.dataSource.qzDS.maxConnections = 30
    
  3.web啟動時自動初始化scheduler,並將其放在ServletContext中,並調用它的start()方法,程序可直接獲取此實例,萬事俱備:
 
    SchedulerFactory sf = (SchedulerFactory)servletContext.getAttribute(QuartzInitializerServlet.QUARTZ_FACTORY_KEY);
    sf..getScheduler();
    
  六、到這步quartz的框框就搭起來了,你可以自己寫個管理類,負責添加,修改,暫停,重啟,刪除Job,比較簡單.
 
  quartz官方文檔寫的已經很詳細了,寫這篇博客的目的是為了讓初學的同學能盡快上手,上手之後再查閱官方文檔的一些具體說明,就會事半功倍.
  本文如果有誤解遺漏之處,還請路過各位多多批評指正,本人有quartz的QQ群歡迎大家來交流學習,群裡有相關學習資料,
 
  QQ群號: 544639268

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved