Quartzd定時任務的簡介和實現

個人博客:https://domyselfzy.github.io/

本文將主要介紹Quartz的相關技術,全文都將基於Springboot做代碼實現。

Quartz簡介

Quartz是一個開源的作業調度框架,可以讓計劃的程序任務一個預定義的日期和時間運行。Quartz可以用來創建簡單或複雜的日程安排執行幾十,幾百,甚至是十萬的作業數。

Quartz核心概念

Quartz API

  • Scheduler - 與調度程序交互的主要API(即:調度器)。
  • Job - 由希望由調度程序執行的組件實現的接口(即:需要被調度執行的任務)。
  • JobDetail - 用於定義作業的實例(即:具體需要被調度任務的封裝對象)。
  • Trigger(即觸發器) - 定義執行給定作業的計劃的組件。
  • JobBuilder - 用於定義/構建JobDetail實例,用於定義作業的實例。
  • TriggerBuilder - 用於定義/構建觸發器實例。

Quartz生命週期

Scheduler的生命期,從SchedulerFactory創建它時開始,到Scheduler調用shutdown()方法時結束;Scheduler被創建後,可以增加、刪除和列舉Job和Trigger,以及執行其它與調度相關的操作(如暫停Trigger)。但是,Scheduler只有在調用start()方法後,纔會真正地觸發trigger(即執行job)

Quartz簡單實例

POM依賴

<!--Quartz依賴-->
<dependency>
	<groupId>org.quartz-scheduler</groupId>
	<artifactId>quartz</artifactId>
	<version>2.3.0</version>
</dependency>

屬性文件

Quartz的配置通常通過使用屬性文件(使用StdSchedulerFactory(消耗配置文件並實例化調度程序))來完成。

默認情況下,StdSchedulerFactory從“當前工作目錄”加載名爲“quartz.properties”的屬性文件。如果失敗,則加載org / quartz包中(作爲資源)的“quartz.properties”文件。如果您希望使用除這些默認值之外的文件,則必須定義系統屬性“org.quartz.properties”以指向所需的文件。

或者,您可以在調用StdSchedulerFactory之前調用getScheduler()時,通過調用其中一個initialize(xx)方法來顯式初始化工廠。

quartz.properties主要配置

  1. 主配置(配置主調度器設置,事務處理)
  2. ThreadPool的配置(調整作業執行的資源)
  3. 偵聽器的配置(您的應用程序可以接收預定事件的通知)
  4. 插件配置(爲您的調度程序添加功能)
  5. RMI服務器和客戶端的配置(從遠程進程使用Quartz實例)
  6. RAMJobStore的配置(存儲作業和觸發器)
  7. JDBC-JobStoreTX的配置(通過JDBC在數據庫中存儲作業和觸發器)
  8. JDBC-JobStoreCMT(具有JTA容器管理事務的JDBC)的配置
  9. DataSources的配置(供JDBC-JobStores使用)
  10. 數據庫集羣的配置(使用JDBC-JobStore實現故障切換和負載平衡)
  11. TerracottaJobStore的配置(無數據庫的集羣)

爲了實用quartz,一個基礎的配置文件要包含以下內容

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

由此配置創建的scheduler具有以下特徵:

org.quartz.scheduler.instanceName - 此調度程序的名稱將爲“MyScheduler”。
org.quartz.threadPool.threadCount - 線程池中有3個線程,這意味着最多可以同時運行3個job。
org.quartz.jobStore.class quartz的所有數據,包括job和trigger的配置,都會存儲在內存中(而不是數據庫裏)。如果你想使用quartz的數據庫存儲功能(校對注:設置成另外一個類),數據庫存儲和使用內存存儲(RamJobStore)後續會講解。

啓動實例

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實例對象後,在調用scheduler.shutdown()之前,scheduler不會終止,因爲還有活躍的線程在執行。

實例化一個Scheduler,並調用一個Job

SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
sched.start();

// define the job and tie it to our HelloJob class
JobDetail job = newJob(HelloJob.class)
  .withIdentity("myJob", "group1")
  .build();

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

// Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章