Quartz-作業調度框架


 

簡介  

 

  Quartz 是個開源的作業調度框架,為在 Java 應用程序中進行作業調度提供了簡單卻強大的機制。Quartz 允許開發人員根據時間間隔(或天)來調度作業。它實現了作業和觸發器的多對多關系,還能把多個作業與不同的觸發器關聯。整合了 Quartz 的應用程序可以重用來自不同事件的作業,還可以為一個事件組合多個作業。雖然可以通過屬性文件(在屬性文件中可以指定 JDBC 事務的數據源、全局作業和/或觸發器偵聽器、插件、線程池,以及更多)配置 Quartz,但它根本沒有與應用程序服務器的上下文或引用集成在一起。結果就是作業不能訪問 Web 服務器的內部函數;例如,在使用 WebSphere 應用服務器時,由 Quartz 調度的作業並不能影響服務器的動態緩存和數據源。

使用前奏

  1. 新建一個maven項目(可以是web也可以是普通的java項目),添加上相關依賴。

<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>

  2. 在resources下新建一個配置文件quartz.properties,添加如下內容:

org.quartz.scheduler.instanceName = MyScheduler #指定調度器的名稱
org.quartz.threadPool.threadCount = 3 #線程池中最多同時有3個線程運行
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore #指定Quartz的數據(job及trigger信息)存儲位置,RamJobStore指內存

啟動一個Scheduler

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工廠中獲取一個任務調度器
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

            //2. 啟動調度器
            scheduler.start();
            System.out.println("scheduler is start...");

            //關閉調度器
            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.
*/

 簡單Helloworld

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工廠中獲取一個任務調度器
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

            //2. 啟動調度器
            scheduler.start();
            System.out.println("scheduler is start...");
            //3. 添加定時任務
            //  3.1 定義job
            JobDetail job = newJob(HelloJob.class)
                    .withIdentity("job1", "group1")
                    .build();

            //  3.2 定義Trigger,使得job現在就運行,並每隔3s中運行一次,重復運行5次, withRepeatCount(number)設定job運行次數為number+1
            Trigger trigger = newTrigger()
                    .withIdentity("trigger1", "group1")
                    .startNow()
                    .withSchedule(simpleSchedule()
                        .withIntervalInSeconds(3)
                        .withRepeatCount(4))
                    .build();

            //  3.3 交給scheduler去調度
            scheduler.scheduleJob(job, trigger);
            //4. 關閉調度器
            //scheduler.shutdown();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**
     * 自定義Job,實現Job接口並實現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

*/

 API說明

Quartz框架核心的幾個類如下:

  • Scheduler - 與scheduler進行交互的主要API,整個生命周期是由SchedulerFactory創建到調用shutdown()方法
  • Job - 希望scheduler進行調度的自定義任務接口,主要實現該接口的execute方法。
  • JobDetail - 定義Job的相關信息
  • Trigger - 定義調度器調度任務的觸發器,主要描述任務的執行時間,周期等信息
  • JobBuilder - 用來定義和創建JobDetail實例
  • TriggerBuilder - 用來定義和創建Trigger實例


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM