Quartz2.2.x官方文檔2.2.X—第一章 快速開始

Quartz快速開始指導


Quartz快速開始指導

(主要作者是 Dafydd James)

歡迎來到關於Quartz的快速開始嚮導. 當你閱讀這份指導時,希望你能理解這些:

  • 如何下載 Quartz
  • 如何安裝 Quartz
  • 配置Quartz以適應你的特殊需求
  • 從一個簡單應用開始

在熟悉了Quartz調度程序的基本特徵之後,思考更多高級特徵(Where),例如:允許任務和觸發器允許在指定的Terracotta clients,而不是隨機選擇其中的一個服務這一企業特性。

下載和安裝

首先, 下載更加穩定的版本(Download the most recent stable release)- 不需要註冊,打開並安裝它,你的應用程序即可使用它。

關於Quartz JAR文件

Quartz包包含幾個jar文件,其位於發行版的根目錄。核心Quartz類庫名爲quartz-xxx.jar (xxx是指當前版本號). 爲了使用Quartz的各種特徵,這個jar必須位於你應用程序的classpath.

一旦你下載了Quartz,並解壓它, 你就可以獲取quartz-xxx.jar並將它放到你你需要的地方 。 (如果你問怎麼解壓壓縮包, 那麼在你進行任何一個開發環境或線上環境應用之前,你應該先去認真學習.)

我使用Quartz主要在應用服務器環境,所以我偏向於讓我的應用包含Quartz Jar(.ear 或者 .war 文件)。無論如何, 你想要使你的Quartz能夠使用於更多的應用中,只需要確保它在你的webapp的classspath。如果你是開發一個獨立應用,讓它和你的依賴的其他jar一樣都放在應用的classpath中。

Quartz依賴於一些第三方類庫(以jars的形式),這些都放在發行版.zip文件的'lib'目錄中。要使用Quartz的所有特性,所有第三方包必須存在於你的classpath中。如果你只是構建一個獨立的Quartz應用,那麼我建議你全部將他們添加到你classpath中。如果你在應用服務環境中使用Quartz,至少有一些jar已經包含在classpath,所以你可以(如果你願意)更有選擇性的包含這些jars。

在一個應用服務環境中,當意外的包含同一個jar的不同版本時,當心產生奇怪的結果。例如,WebLogic包含一個J2EE的實現(包含在weblogic.jar中),而servlet.jar中包含不同的另一個實現。因此,推薦你的應用環境應不在servlet.jar中,這樣有利於你可以知道哪些類被使用。

屬性文件

Quartz使用的屬性文件叫做quartz.properties. 一開始時這不是必要的,但是在使用任何基礎配置之前,你必須讓它位於你的classpath中.

再一次根據我的個人情況給出一個例子,我的應用程序使用WebLogic WorkShop開發. 我保持讓我項目中所有配置文件(包括quartz.properties)都在應用的根目錄中。當我打包所有東西進一個.ear文件,配置項目被打包進.jar幷包含在最終的.ear文件中。這樣quartz.properties就自動位於classpath中。

如果你想要構建一個包含Quartz的web應用(以.war形式存在),爲了讓quartz.properties在classpath下,你需要將其放置在WEB-INF/classes中。

配置

這是一個大問題!Quartz是一個可以自由配置的應用。配置Quartz最好的方式是修改quartz.properties,並讓它位於你應用的classpath下。(參考上面安裝部分).

在Quartz發行版中有幾個關於配置文件的例子,詳情在examples/文件夾下. 我支持你創建屬於你自己的quartz.properties文件,而不是複製例子刪除其中你不需要的項. 這種方式更加整潔,並且你可以學習到Quartz提供的更多配置.

可用屬性完整文檔在這裏 Quartz Configuration Reference.

需要快速啓動和運行,一個基本的 quartz.properties文件看起來像這樣=:

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

這個被配置文件創建的調度器有以下特徵:

  • org.quartz.scheduler.instanceName - 這個調度器的名稱將會使用“MyScheduler”.
  • org.quartz.threadPool.threadCount - 線程池有三個線程,含義是同時允許三個任務運行。
  • org.quartz.jobStore.class - 所有Quartz數據,例如jobs的詳情和觸發器,都會保存在內存中(而不是數據庫)。及時你有數據庫,並想使用它來運行Quartz,我仍然建議你在你使用數據庫打開一個全新的維度之前,先使用RamJobStore讓Quartz工作起來。

從一個應用應用開始

現在下載並安裝Quartz,是時候拿一個簡單的應用讓它跑起來。下面的代碼可以獲得一個調度實例,運行、終止該調度:

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.shutdown()前你的應用不能終止,因爲有活躍的線程。

注意代碼例子中靜態導入部分;在下面的例子中將會發揮作用。

如果你沒有設置logging,所有日誌將會發送到控制檯,你的輸出看起來像這樣:

[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()之前,你需要些時間觸發和執行任務-在當前這個簡單例子裏,你只需要添加並調用Thread.sleep(60000) 即可).

現在讓我們做一些有意思的事情!

原文地址:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/quick-start.html

Demo Github地址:https://github.com/whp1473/quartz-demo/tree/master/sample

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