SpringBoot整合Quartz定時任務 的簡單實例 2


(1)什么是Quartz?
(2)Quartz的特點;
(3)Quartz專用詞匯說明;
(4)Quartz任務調度基本實現原理;

 

       接下來看下具體的內容:

(1)什么是Quartz?

Quartz是一個完全由Java編寫的開源作業調度框架,為在Java應用程序中進行作業調度提供了簡單卻強大的機制。Quartz允許開發人員根據時間間隔來調度作業。它實現了作業和觸發器的多對多的關系,還能把多個作業與不同的觸發器關聯。簡單地創建一個org.quarz.Job接口的Java類。

 

(2)Quartz的特點;

作為一個優秀的開源調度框架,Quartz 具有以下特點:

① 強大的調度功能,例如支持豐富多樣的調度方法,可以滿足各種常規及特殊需求;

②   靈活的應用方式,例如支持任務和調度的多種組合方式,支持調度數據的多種存儲方式;

③ 分布式和集群能力,Terracotta 收購后在原來功能基礎上作了進一步提升。

④ Quartz 很容易與 Spring 集成實現靈活可配置的調度功能。

 

(3)Quartz專用詞匯說明;

下面是本文中用到的一些專用詞匯,在此聲明:

scheduler

任務調度器

trigger

觸發器,用於定義任務調度時間規則

job

任務,即被調度的任務

misfire

錯過的,指本來應該被執行但實際沒有被執行的任務調度

 

 

(4)Quartz任務調度基本實現原理;

Quartz 任務調度的核心元素是 scheduler, trigger 和 job,其中 trigger 和 job 是任務調度的元數據,scheduler 是實際執行調度的控制器。

在 Quartz 中,trigger 是用於定義調度時間的元素,即按照什么時間規則去執行任務。Quartz 中主要提供了四種類型的 trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,和 NthIncludedDayTrigger。這四種 trigger 可以滿足企業應用中的絕大部分需求。

在 Quartz 中,job 用於表示被調度的任務。主要有兩種類型的 job:無狀態的(stateless)和有狀態的(stateful)。對於同一個 trigger 來說,有狀態的 job 不能被並行執行,只有上一次觸發的任務被執行完之后,才能觸發下一次執行。Job 主要有兩種屬性:volatility 和 durability,其中 volatility 表示任務是否被持久化到數據庫存儲,而 durability 表示在沒有 trigger 關聯的時候任務是否被保留。兩者都是在值為 true 的時候任務被持久化或保留。一個 job 可以被多個 trigger 關聯,但是一個 trigger 只能關聯一個 job。

 

       在 Quartz 中, scheduler 由 scheduler 工廠創建:DirectSchedulerFactory 或者 StdSchedulerFactory。 第二種工廠 StdSchedulerFactory 使用較多,因為 DirectSchedulerFactory 使用起來不夠方便,需要作許多詳細的手工編碼設置。 Scheduler 主要有三種:RemoteMBeanScheduler, RemoteScheduler 和 StdScheduler。本文以最常用的 StdScheduler 為例講解。這也是筆者在項目中所使用的 scheduler 類。

 

 

這一篇文章,我們緊接着上一篇的文章,講講在Quartz在java project的項目中如何進行使用,在這里我們使用maven進行構建項目。先看下本章的大綱:

(1)新建工程quartz-java;
(2)配置pom.xml文件;
(3)編碼說明;
(4)編寫Job類;
(5)編寫啟動類進行代碼測試;
(6)quartz.properties配置文件說明;

 

       接下里一起看下具體的內容:

(1)新建工程quartz-java;

       新建一個java project取名為quartz-java。

(2)配置pom.xml文件;

       在pom.xml文件中添加quartz的依賴:

<dependency>

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

            <artifactId>quartz</artifactId>

            <version>2.2.3</version>

</dependency>

 

(3)編碼說明;

(一)首先我們需要定義一個任務類,比如為HelloJob ,該類需要繼承Job類,然后添加execute(JobExecutionContext context)方法,在這個方法中就是我們具體的任務執行的地方。

(二)在哪里定義“在什么時候執行什么任務呢?”:那么我們需要Scheduler,此類的創建方式使用Quartz提供的工廠類StdSchedulerFactory.getDefaultScheduler()進行創建。

(三)如何觸發呢:scheduler.scheduleJob(jobDetail,trigger);進行觸發定時任務,在這里需要兩個參數。jobDetail可以通過JobBuilder.newJob進行創建,在這里就需要制定一個Job類了,也就是我們第一步創建的HelloJob;trigger類的話,可以通過TriggerBuilder.newTrigger進行創建。

 

(4)編寫Job類;

編寫HelloJob任務類:

package com.kfit.job;

 

import java.util.Date;

 

import org.quartz.Job;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

 

/**

 * 任務類.

 * @author Angel --守護天使

 * @version v.0.1

 * @date 2017年4月21日

 */

public class HelloJob implements Job{

 

    public void execute(JobExecutionContext context) throws JobExecutionException {

        // 執行響應的任務.

       System.out.println("HelloJob.execute,"+new Date());

    }

   

}

 

(5)編寫啟動類進行代碼測試;

在Main方法中進行編碼測試:

package com.kfit;

 

import java.util.concurrent.TimeUnit;

 

import org.quartz.JobBuilder;

import org.quartz.JobDetail;

import org.quartz.Scheduler;

import org.quartz.SchedulerException;

import org.quartz.SimpleScheduleBuilder;

import org.quartz.Trigger;

import org.quartz.TriggerBuilder;

import org.quartz.impl.StdSchedulerFactory;

 

import com.kfit.job.HelloJob;

 

/**

 * 直接在Main方法中進行啟動測試.

 * @author Angel --守護天使

 * @version v.0.1

 * @date 2017年4月21日

 */

public class App {

    public static void main(String[] args) throws SchedulerException, InterruptedException {

       /*

        *在 Quartz 中, scheduler 由 scheduler 工廠創建:DirectSchedulerFactory 或者StdSchedulerFactory。第二種工廠 StdSchedulerFactory 使用較多,

        *因為 DirectSchedulerFactory 使用起來不夠方便,需要作許多詳細的手工編碼設置。

        */

       // 獲取Scheduler實例

       Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

       scheduler.start();

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

      

       //具體任務.

       JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("job1","group1").build();

      

       //觸發時間點. (每5秒執行1次.)

       SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever();

       Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1","group1").startNow().withSchedule(simpleScheduleBuilder).build();

      

       // 交由Scheduler安排觸發

       scheduler.scheduleJob(jobDetail,trigger);

      

       //睡眠20秒.

       TimeUnit.SECONDS.sleep(20);

       scheduler.shutdown();//關閉定時任務調度器.

       System.out.println("scheduler.shutdown");

    }

}

執行代碼查看控制台的打印信息:

-----------------------------------------------------------

scheduler.start

HelloJob.execute,Fri Apr 21 19:50:01 CST 2017

HelloJob.execute,Fri Apr 21 19:50:06 CST 2017

HelloJob.execute,Fri Apr 21 19:50:11 CST 2017

HelloJob.execute,Fri Apr 21 19:50:16 CST 2017

HelloJob.execute,Fri Apr 21 19:50:21 CST 2017

scheduler.shutdown

 


免責聲明!

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



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