Quartz教程--快速入門

歡迎來到quartz快速入門教程。閱讀本教程,你將會了解:java

  • quartz下載git

  • quartz安裝github

  • 根據你的須要,配置Quartzweb

  • 開始一個示例應用數據庫

當熟悉了quratz調度的基本功能後,能夠嘗試一些更高級的特性,好比Where,這個一個企業級功能,可讓job和trigger運行在指定的,而不是隨機的Terracotta客戶端上。服務器

下載和安裝

首先,下載最新的穩定版 - 不用註冊。解壓並安裝。app

Quartz jar文件

quartz安裝包根目錄的lib/目錄下有不少的jar包。其中,quartz-xxx.jar(其中xxx是版本號)是最主要的。爲了使用quartz,必須將該jar包放在應用的classpath下;ui

下載後,解壓,而後將quartz-xxx.jar放到你的應用中。spa

我主要是在應用服務器的環境中使用quartz,因此通常將quartz jar包放到應用中(.ear或.war)。固然,若是你但願在不少應用中使用quartz,將quartz的jar包放在應用服務器(appserver)的classpath下便可。若是你只是但願在獨立的應用中使用quartz,將quartz的jar包和你的應用依賴的其它jar包放在一塊兒便可。線程

quzrtz依賴一些第三方的庫(以jar包的形式),這些庫位於quartz安裝包的lib目錄下。要使用quartz的全部功能,必須將全部的第三方jar包都放到classpath下。若是你開發的是一個獨立的quartz應用,建議將全部的jar包都放到classpath下;若是是在應用服務器環境下使用quartz,其中有些包可能已經存在於classpath中了,所以你須要本身選擇。

在應用服務器環境下,若是同一個jar文件,存在兩個不一樣的版本,要注意,可能會產生一些奇怪的結果;好比,WebLogic包含了一個J2EE的實現(在weblogic.jar中),該實現與servlet.jar的實現可能不一致。此時,應該從你的應用中排除掉servlet.jar,這樣你就知道使用的是哪一個類了。

properties文件

quartz使用名爲quartz.properties的配置文件。剛開始時該配置文件不是必須的,可是爲了使用最基本的配置,該文件必須位於classpath下。

基於個人我的狀況舉個例子,個人應用是基於WebLogic Workshop開發的。我將全部的配置文件(包括quartz.properties)放到應用根目錄下的一個項目中。當我將項目打包成.ear文件時,放置配置文件的項目會以jar包的形式進入最終的.ear包,因此quartz.properties文件就自動位於classpath中了。

若是你準備構建一個使用quartz的web應用(以.war包的形式),你應該將quartz.properties文件放到WEB-INF/classes目錄下。

配置

這裏包含不少內容。quartz是一個配置很靈活的應用。配置quartz最好的方式是,編輯quartz.properties文件,而後放到應用的classpath下。

quartz的安裝包中包含了一些配置文件的示例,位於example/目錄下。我建議你建立本身的quartz.properties文件,而不是簡單地從示例中拷貝並刪除不須要的部分。這樣看起來更整潔,並且你也會了解到quartz的更多功能。

關於quartz配置文件的詳細文檔,請查閱Quartz配置參考

爲了使用quartz,一個基本的quartz.properties配置文件以下所示:

org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

上述配置的scheduler有以下特色:

  • org.quartz.scheduler.instanceName - scheduler的名稱爲「MyScheduler」

  • org.quartz.threadPool.threadCount - 線程池中有3個線程,即最多能夠同時執行3個job;

  • org.quartz.jobStore.class - quartz的全部數據,包括job和trigger的配置,都會存儲在內存中(而不是數據庫裏)。若是你想使用quartz的數據庫存儲功能,咱們建議在使用數據庫存儲以前,先使用內存存儲(RamJobStore)。

示例應用

下載和安裝完quartz後,是時候開發一個示例應用,並讓它跑起來了。下面的示例代碼,獲取scheduler實例對象,啓動,而後關閉。

QuartzTest.java

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;

public class QuartzTest {

    public static void main(String[] args) {

        try {
            // Grab the Scheduler instance from the Factory
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

            // and start it off
            scheduler.start();

            scheduler.shutdown();

        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
}

當你調用StdSchedulerFactory.getDefaultScheduler()獲取scheduler實例對象後,在調用scheduler.shutdown()以前,scheduler不會終止,由於還有活躍的線程在執行。

注意示例代碼中的靜態導入(static import),下面的代碼中也會用到它們。

若是你沒有配置日誌輸出,全部的日誌會輸出到控制檯,好比:

[INFO] 21 Jan 08:46:27.857 AM main [org.quartz.core.QuartzScheduler]
Quartz Scheduler v.2.0.0-SNAPSHOT created.

[INFO] 21 Jan 08:46:27.859 AM main [org.quartz.simpl.RAMJobStore]
RAMJobStore initialized.

[INFO] 21 Jan 08:46:27.865 AM main [org.quartz.core.QuartzScheduler]
Scheduler meta-data: Quartz Scheduler (v2.0.0) 'Scheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 50 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.


[INFO] 21 Jan 08:46:27.865 AM main [org.quartz.impl.StdSchedulerFactory]
Quartz scheduler 'Scheduler' initialized from default resource file in Quartz package: 'quartz.properties'

[INFO] 21 Jan 08:46:27.866 AM main [org.quartz.impl.StdSchedulerFactory]
Quartz scheduler version: 2.0.0

[INFO] 21 Jan 08:46:27.866 AM main [org.quartz.core.QuartzScheduler]
Scheduler Scheduler_$_NON_CLUSTERED started.

[INFO] 21 Jan 08:46:27.866 AM main [org.quartz.core.QuartzScheduler]
Scheduler Scheduler_$_NON_CLUSTERED shutting down.

[INFO] 21 Jan 08:46:27.866 AM main [org.quartz.core.QuartzScheduler]
Scheduler Scheduler_$_NON_CLUSTERED paused.

[INFO] 21 Jan 08:46:27.867 AM main [org.quartz.core.QuartzScheduler]
Scheduler Scheduler_$_NON_CLUSTERED shutdown complete.

你能夠在start()和shutdown()之間作一些有趣的事情:

// define the job and tie it to our HelloJob class
JobDetail job = newJob(HelloJob.class)
    .withIdentity("job1", "group1")
    .build();

// Trigger the job to run now, and then repeat every 40 seconds
Trigger trigger = newTrigger()
    .withIdentity("trigger1", "group1")
    .startNow()
    .withSchedule(simpleSchedule()
            .withIntervalInSeconds(40)
            .repeatForever())            
    .build();

// Tell quartz to schedule the job using our trigger
scheduler.scheduleJob(job, trigger);

在調用shutdown()以前,你須要給job的觸發和執行預留一些時間,好比,你能夠調用Thread.sleep(60000)讓線程睡眠一段時間。

好了,本身去探索吧!

相關文章
相關標籤/搜索