Quartz-作業(yè)調(diào)度框架

簡(jiǎn)介  

  Quartz 是個(gè)開(kāi)源的作業(yè)調(diào)度框架,為在 Java 應(yīng)用程序中進(jìn)行作業(yè)調(diào)度提供了簡(jiǎn)單卻強(qiáng)大的機(jī)制。Quartz 允許開(kāi)發(fā)人員根據(jù)時(shí)間間隔(或天)來(lái)調(diào)度作業(yè)。它實(shí)現(xiàn)了作業(yè)和觸發(fā)器的多對(duì)多關(guān)系,還能把多個(gè)作業(yè)與不同的觸發(fā)器關(guān)聯(lián)。整合了 Quartz 的應(yīng)用程序可以重用來(lái)自不同事件的作業(yè),還可以為一個(gè)事件組合多個(gè)作業(yè)。雖然可以通過(guò)屬性文件(在屬性文件中可以指定 JDBC 事務(wù)的數(shù)據(jù)源、全局作業(yè)和/或觸發(fā)器偵聽(tīng)器、插件、線程池,以及更多)配置 Quartz,但它根本沒(méi)有與應(yīng)用程序服務(wù)器的上下文或引用集成在一起。結(jié)果就是作業(yè)不能訪問(wèn) Web 服務(wù)器的內(nèi)部函數(shù);例如,在使用 WebSphere 應(yīng)用服務(wù)器時(shí),由 Quartz 調(diào)度的作業(yè)并不能影響服務(wù)器的動(dòng)態(tài)緩存和數(shù)據(jù)源。

使用前奏

  1. 新建一個(gè)maven項(xiàng)目(可以是web也可以是普通的java項(xiàng)目),添加上相關(guān)依賴。

復(fù)制代碼

<properties>

? ? <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

? ? <quartz.version>2.2.0</quartz.version>

</properties>

<dependencies>

....

<!--quartz dependency-->

? ? ? <dependency>

? ? ? ? ? <groupId>org.quartz-scheduler</groupId>

? ? ? ? ? <artifactId>quartz-jobs</artifactId>

? ? ? ? ? <version>${quartz.version}</version>

? ? ? </dependency>

? ? ? <dependency>

? ? ? ? ? <groupId>org.quartz-scheduler</groupId>

? ? ? ? ? <artifactId>quartz</artifactId>

? ? ? ? ? <version>${quartz.version}</version>

? ? ? </dependency>

</dependencies>

復(fù)制代碼

  2. 在resources下新建一個(gè)配置文件quartz.properties,添加如下內(nèi)容:

org.quartz.scheduler.instanceName = MyScheduler #指定調(diào)度器的名稱

org.quartz.threadPool.threadCount = 3 #線程池中最多同時(shí)有3個(gè)線程運(yùn)行

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore #指定Quartz的數(shù)據(jù)(job及trigger信息)存儲(chǔ)位置,RamJobStore指內(nèi)存

啟動(dòng)一個(gè)Scheduler

復(fù)制代碼

package com.netease.test.quartz;

import org.quartz.Scheduler;

import org.quartz.SchedulerException;

import org.quartz.impl.StdSchedulerFactory;

/**

* User: hzwangxx

* Date: 14-2-26

* Time: 0:16

*/

public class QuartzTest {

? ? public static void main(String[] args) {

? ? ? ? try {

? ? ? ? ? ? //1.從StdSchedulerFactory工廠中獲取一個(gè)任務(wù)調(diào)度器

? ? ? ? ? ? Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

? ? ? ? ? ? //2. 啟動(dòng)調(diào)度器

? ? ? ? ? ? scheduler.start();

? ? ? ? ? ? System.out.println("scheduler is start...");

? ? ? ? ? ? //關(guān)閉調(diào)度器

? ? ? ? ? ? scheduler.shutdown();

? ? ? ? } catch (SchedulerException e) {

? ? ? ? ? ? e.printStackTrace();? //To change body of catch statement use File | Settings | File Templates.

? ? ? ? }

? ? }

}

/*

? console output:

2014-02-26 00:22:31,744 0? ? [main] INFO? - Using default implementation for ThreadExecutor

2014-02-26 00:22:31,766 22? [main] INFO? - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl

2014-02-26 00:22:31,767 23? [main] INFO? - Quartz Scheduler v.2.2.0 created.

2014-02-26 00:22:31,768 24? [main] INFO? - RAMJobStore initialized.

2014-02-26 00:22:31,769 25? [main] INFO? - Scheduler meta-data: Quartz Scheduler (v2.2.0) 'MyScheduler' 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 3 threads.

? Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

2014-02-26 00:22:31,769 25? [main] INFO? - Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'

2014-02-26 00:22:31,769 25? [main] INFO? - Quartz scheduler version: 2.2.0

2014-02-26 00:22:31,769 25? [main] INFO? - Scheduler MyScheduler_$_NON_CLUSTERED started.

scheduler is start...

2014-02-26 00:22:31,769 25? [main] INFO? - Scheduler MyScheduler_$_NON_CLUSTERED shutting down.

2014-02-26 00:22:31,770 26? [main] INFO? - Scheduler MyScheduler_$_NON_CLUSTERED paused.

2014-02-26 00:22:31,770 26? [main] INFO? - Scheduler MyScheduler_$_NON_CLUSTERED shutdown complete.

*/

復(fù)制代碼

簡(jiǎn)單Helloworld

復(fù)制代碼

package com.netease.test.quartz;

import org.quartz.*;

import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;

import static org.quartz.JobBuilder.newJob;

import static org.quartz.SimpleScheduleBuilder.simpleSchedule;

import static org.quartz.TriggerBuilder.newTrigger;

/**

* User: hzwangxx

* Date: 14-2-26

* Time: 0:16

*/

public class QuartzTest {

? ? public static void main(String[] args) {

? ? ? ? try {

? ? ? ? ? ? //1.從StdSchedulerFactory工廠中獲取一個(gè)任務(wù)調(diào)度器

? ? ? ? ? ? Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

? ? ? ? ? ? //2. 啟動(dòng)調(diào)度器

? ? ? ? ? ? scheduler.start();

? ? ? ? ? ? System.out.println("scheduler is start...");

? ? ? ? ? ? //3. 添加定時(shí)任務(wù)

? ? ? ? ? ? //? 3.1 定義job

? ? ? ? ? ? JobDetail job = newJob(HelloJob.class)

? ? ? ? ? ? ? ? ? ? .withIdentity("job1", "group1")

? ? ? ? ? ? ? ? ? ? .build();

? ? ? ? ? ? //? 3.2 定義Trigger,使得job現(xiàn)在就運(yùn)行,并每隔3s中運(yùn)行一次,重復(fù)運(yùn)行5次, withRepeatCount(number)設(shè)定job運(yùn)行次數(shù)為number+1

? ? ? ? ? ? Trigger trigger = newTrigger()

? ? ? ? ? ? ? ? ? ? .withIdentity("trigger1", "group1")

? ? ? ? ? ? ? ? ? ? .startNow()

? ? ? ? ? ? ? ? ? ? .withSchedule(simpleSchedule()

? ? ? ? ? ? ? ? ? ? ? ? .withIntervalInSeconds(3)

? ? ? ? ? ? ? ? ? ? ? ? .withRepeatCount(4))

? ? ? ? ? ? ? ? ? ? .build();

? ? ? ? ? ? //? 3.3 交給scheduler去調(diào)度

? ? ? ? ? ? scheduler.scheduleJob(job, trigger);

? ? ? ? ? ? //4. 關(guān)閉調(diào)度器

? ? ? ? ? ? //scheduler.shutdown();

? ? ? ? } catch (SchedulerException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? }

? ? /**

? ? * 自定義Job,實(shí)現(xiàn)Job接口并實(shí)現(xiàn)execute方法

? ? */

? ? public static class HelloJob implements Job{

? ? ? ? public void execute(JobExecutionContext context) throws JobExecutionException {

? ? ? ? ? ? System.out.println("execute job at " + new Date() + " by trigger " + context.getTrigger().getJobKey());

? ? ? ? }

? ? }

}

/*

? console output:

2014-02-26 01:05:25,766 0? ? [main] INFO? - Using default implementation for ThreadExecutor

2014-02-26 01:05:25,794 28? [main] INFO? - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl

2014-02-26 01:05:25,795 29? [main] INFO? - Quartz Scheduler v.2.2.0 created.

2014-02-26 01:05:25,797 31? [main] INFO? - RAMJobStore initialized.

2014-02-26 01:05:25,798 32? [main] INFO? - Scheduler meta-data: Quartz Scheduler (v2.2.0) 'MyScheduler' 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 3 threads.

? Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

2014-02-26 01:05:25,798 32? [main] INFO? - Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'

2014-02-26 01:05:25,799 33? [main] INFO? - Quartz scheduler version: 2.2.0

2014-02-26 01:05:25,799 33? [main] INFO? - Scheduler MyScheduler_$_NON_CLUSTERED started.

scheduler is start...

execute job at Wed Feb 26 01:05:25 CST 2014 by trigger group1.job1

execute job at Wed Feb 26 01:05:28 CST 2014 by trigger group1.job1

execute job at Wed Feb 26 01:05:31 CST 2014 by trigger group1.job1

execute job at Wed Feb 26 01:05:34 CST 2014 by trigger group1.job1

execute job at Wed Feb 26 01:05:37 CST 2014 by trigger group1.job1

*/

復(fù)制代碼

API說(shuō)明

Quartz框架核心的幾個(gè)類如下:

Scheduler - 與scheduler進(jìn)行交互的主要API,整個(gè)生命周期是由SchedulerFactory創(chuàng)建到調(diào)用shutdown()方法

Job - 希望scheduler進(jìn)行調(diào)度的自定義任務(wù)接口,主要實(shí)現(xiàn)該接口的execute方法。

JobDetail - 定義Job的相關(guān)信息

Trigger - 定義調(diào)度器調(diào)度任務(wù)的觸發(fā)器,主要描述任務(wù)的執(zhí)行時(shí)間,周期等信息

JobBuilder - 用來(lái)定義和創(chuàng)建JobDetail實(shí)例

TriggerBuilder - 用來(lái)定義和創(chuàng)建Trigger實(shí)例

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容