首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Quartz 企業級排程框架入門 (一):核心概念與 HelloWorld 實作

     編輯:Java 相關知識

什麼是 Job Scheduling System

負責在預定時間自動執行或通知應用元件的系統。例:每週一 09:30 發送業務報表 Email。

JDK 內建 Timer 的不足

  • java.util.Timer/TimerTask 功能單薄:不支援持久化、執行緒池、類 Cron 運算式、叢集高可用。
  • 高級功能需大量自行擴充,維護成本高。

Quartz 簡介

  • OpenSymphony 開源專案,專注排程領域。
  • 輕量級:單一 quartz.jar 即可運作。
  • 可選資料庫持久化:機器重啟後保留排程狀態。
  • 核心介面 Scheduler:排程/取消、啟動/暫停/關閉。
  • 豐富 Listener:JobListener, TriggerListener, SchedulerListener 完整監控執行生命週期。

HelloWorld 完整範例

import java.util.Date;
import org.quartz.*;

public class SayHelloWorldJob implements Job {
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Hello World! " + new Date());
    }

    public static void main(String[] args) throws Exception {
        // 1. 取得 Scheduler
        SchedulerFactory factory = new StdSchedulerFactory();
        Scheduler scheduler = factory.getScheduler();

        // 2. 定義 JobDetail (任務元資料)
        JobDetail jobDetail = new JobDetail("SayHelloWorldJob", 
                                          Scheduler.DEFAULT_GROUP, 
                                          SayHelloWorldJob.class);

        // 3. 定義 Trigger (觸發條件) — 立即執行一次
        Trigger trigger = new SimpleTrigger("SayHelloWorldTrigger",
                                          Scheduler.DEFAULT_GROUP,
                                          new Date(), null, 0, 0L);

        // 4. 註冊並啟動
        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start(); // 關鍵:啟動排程執行緒
    }
}

核心概念深度解析

1. Job — 業務邏輯載體

實作 org.quartz.Job 介面,唯一方法 execute(JobExecutionContext)。JobExecutionContext 提供執行時上下文:Scheduler, JobDetail, Trigger 等引用。

2. JobDetail — 任務定義

不可變資料物件,包含:

  • name + group:唯一識別 (同群組名稱不可重複)。
  • jobClass:實際執行類別。
  • JobDataMap:攜帶參數資料 (Key-Value),execute() 可取用。

3. Trigger — 觸發規則

分離「任務」與「何時執行」:

Trigger 類型適用場景關鍵參數
SimpleTrigger固定間隔、特定次數、特定時間點repeatCount, repeatInterval
CronTrigger行事曆式排程 (每週五 15:00、每月最後一天)cronExpression (Unix cron 語法)

範例中 SimpleTrigger 參數:startTime=now, endTime=null, repeatCount=0, repeatInterval=0 → 立即執行一次。

4. Scheduler — 排程引擎

  • scheduleJob(jobDetail, trigger):建立關聯。
  • start():啟動內部執行緒池,開始評估 Trigger。
  • 同一 Scheduler 內,group+name 唯一識別 Job/Trigger。

進階:傳遞參數到 Job

方案一:JobDataMap (隨 JobDetail 持久化)

jobDetail.getJobDataMap().put("emailFrom", "admin@example.com");
jobDetail.getJobDataMap().put("retryCount", 3);

// execute() 內取用
String from = context.getJobDetail().getJobDataMap().getString("emailFrom");
int retry = context.getJobDetail().getJobDataMap().getInt("retryCount");

限制:若使用 JDBC JobStore,JobDataMap 會被序列化儲存,**值必須實作 Serializable**;DataSource, Connection 等不可序列化物件無法直接存放。

方案二:SchedulerContext (全域共享、不持久化)

// 啟動前註冊
scheduler.getContext().put("dataSource", myDataSource);

// Job 內取用
DataSource ds = (DataSource) context.getScheduler().getContext().get("dataSource");

適合資料庫連線池、快取管理器等非序列化、全域單例資源。

下一篇預告

  • CronTrigger 進階運算式與時區處理。
  • JDBC JobStore 設定與叢集部署。
  • Listener 實作監控與失敗重試策略。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved