Quartz快速入門(mén)指南

2021-11-16 16:00 更新

歡迎使用Quartz的QuickStart指南。在閱讀本指南時(shí),希望看到以下細(xì)節(jié):

  • 下載Quartz
  • 安裝Quartz
  • 根據(jù)您自己的特殊需求配置Quartz
  • 啟動(dòng)示例應(yīng)用程序

熟悉Quartz Scheduler的基本功能之后,可以考慮更高級(jí)的功能,例如Where,這個(gè)一個(gè)企業(yè)級(jí)功能,可以讓job和trigger運(yùn)行在指定的,而不是隨機(jī)的Terracotta客戶端上。

下載并安裝

首先,下載最新的穩(wěn)定版本 - 不需要注冊(cè)。打開(kāi)發(fā)行版的包裝并安裝它,以便您的應(yīng)用程序可以看到它。

Quartz JAR文件

quartz安裝包根目錄的lib/目錄下有很多的jar包。其中,quartz-xxx.jar(其中xxx是版本號(hào))是最主要的。為了使用quartz,必須將該jar包放在應(yīng)用的classpath下;

下載后,解壓,然后將quartz-xxx.jar放到你的應(yīng)用中。

我主要是在應(yīng)用服務(wù)器的環(huán)境中使用quartz,所以一般將quartz jar包放到應(yīng)用中(.ear或.war)。當(dāng)然,如果你希望在很多應(yīng)用中使用quartz,將quartz的jar包放在應(yīng)用服務(wù)器(appserver)的classpath下即可。如果你只是希望在獨(dú)立的應(yīng)用中使用quartz,將quartz的jar包和你的應(yīng)用依賴的其它jar包放在一起即可。

quzrtz依賴一些第三方的庫(kù)(以jar包的形式),這些庫(kù)位于quartz安裝包的lib目錄下。要使用quartz的所有功能,必須將所有的第三方j(luò)ar包都放到classpath下。如果你開(kāi)發(fā)的是一個(gè)獨(dú)立的quartz應(yīng)用,建議將所有的jar包都放到classpath下;如果是在應(yīng)用服務(wù)器環(huán)境下使用quartz,其中有些包可能已經(jīng)存在于classpath中了,因此你需要自己選擇。

在應(yīng)用服務(wù)器環(huán)境下,如果同一個(gè)jar文件,存在兩個(gè)不同的版本,要注意,可能會(huì)產(chǎn)生一些奇怪的結(jié)果;比如,WebLogic包含了一個(gè)J2EE的實(shí)現(xiàn)(在weblogic.jar中),該實(shí)現(xiàn)與servlet.jar的實(shí)現(xiàn)可能不一致。此時(shí),應(yīng)該從你的應(yīng)用中排除掉servlet.jar,這樣你就知道使用的是哪個(gè)類了。

屬性文件

quartz使用名為quartz.properties的配置文件。剛開(kāi)始時(shí)該配置文件不是必須的,但是為了使用最基本的配置,該文件必須位于classpath下。

基于我的個(gè)人情況舉個(gè)例子,我的應(yīng)用是基于WebLogic Workshop開(kāi)發(fā)的。我將所有的配置文件(包括quartz.properties)放到應(yīng)用根目錄下的一個(gè)項(xiàng)目中。當(dāng)我將項(xiàng)目打包成.ear文件時(shí),放置配置文件的項(xiàng)目會(huì)以jar包的形式進(jìn)入最終的.ear包,所以quartz.properties文件就自動(dòng)位于classpath中了。

如果你準(zhǔn)備構(gòu)建一個(gè)使用quartz的web應(yīng)用(以.war包的形式),你應(yīng)該將quartz.properties文件放到WEB-INF/classes目錄下。

組態(tài)

這里包含很多內(nèi)容。quartz是一個(gè)配置很靈活的應(yīng)用。配置quartz最好的方式是,編輯quartz.properties文件,然后放到應(yīng)用的classpath下。

quartz的安裝包中包含了一些配置文件的示例,位于example/目錄下。我建議你創(chuàng)建自己的quartz.properties文件,而不是簡(jiǎn)單地從示例中拷貝并刪除不需要的部分。這樣看起來(lái)更整潔,而且你也會(huì)了解到quartz的更多功能。

關(guān)于quartz配置文件的詳細(xì)文檔,請(qǐng)查閱Quartz配置參考

為了使用quartz,一個(gè)基本的quartz.properties配置文件如下所示:

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

由此配置創(chuàng)建的scheduler具有以下特征:

  • org.quartz.scheduler.instanceName - 此調(diào)度程序的名稱將為“MyScheduler”。
  • org.quartz.threadPool.threadCount - 線程池中有3個(gè)線程,這意味著最多可以同時(shí)運(yùn)行3個(gè)job。
  • org.quartz.jobStore.class quartz的所有數(shù)據(jù),包括job和trigger的配置,都會(huì)存儲(chǔ)在內(nèi)存中(而不是數(shù)據(jù)庫(kù)里)。如果你想使用quartz的數(shù)據(jù)庫(kù)存儲(chǔ)功能(校對(duì)注:設(shè)置成另外一個(gè)類),我們建議在使用數(shù)據(jù)庫(kù)存儲(chǔ)之前,先使用內(nèi)存存儲(chǔ)(RamJobStore)。

啟動(dòng)示例應(yīng)用程序

下載和安裝完quartz后,是時(shí)候開(kāi)發(fā)一個(gè)示例應(yīng)用,并讓它跑起來(lái)了。下面的示例代碼,獲取scheduler實(shí)例對(duì)象,啟動(dòng),然后關(guān)閉。

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();
          }
      }
  }
  • 當(dāng)你調(diào)用StdSchedulerFactory.getDefaultScheduler()獲取scheduler實(shí)例對(duì)象后,在調(diào)用scheduler.shutdown()之前,scheduler不會(huì)終止,因?yàn)檫€有活躍的線程在執(zhí)行。。

注意示例代碼中的靜態(tài)導(dǎo)入(static import),下面的代碼中也會(huì)用到它們。

如果你沒(méi)有配置日志輸出,所有的日志會(huì)輸出到控制臺(tái),比如:

[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= JobBuilder.newJob(HelloJob.class)
      .withIdentity("job1", "group1")
      .build();

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

  // Tell quartz to schedule the job using our trigger
  scheduler.scheduleJob(job, trigger);
在調(diào)用shutdown()之前,你需要給job的觸發(fā)和執(zhí)行預(yù)留一些時(shí)間,比如,你可以調(diào)用Thread.sleep(60000)讓線程睡眠一段時(shí)間。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)