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

Quartz 2.x 單機與集群任務調度完整實戰指南

     編輯:Java 綜合教學

一、Quartz 核心概念

  • JobDetail (任務):承載任務實例,Quartz 2.x 透過 JobBuilder 建立。實作 Job 介面的 execute() 方法。
  • Trigger (觸發器):定義執行時間、頻率。SimpleTrigger 適合固定間隔;CronTrigger 支援複雜 Cron 表達式。
  • Scheduler (調度器):核心管理器,基於多執行緒池並發執行任務。

二、單機模式實作

1. 專案結構與依賴

建立 Java 專案,導入 quartz-2.2.1.jar、slf4j-api-1.7.22.jar、slf4j-simple-1.7.22.jar。

專案結構

2. 任務實作類

public class SingleQuartzJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Hello, Quartz! - executing at " + new Date() + " by " + context.getTrigger().getJobKey());
    }
}

3. 調度服務 (SimpleTrigger 範例)

public class SingleQuartzServer {
    public static void main(String[] args) throws SchedulerException {
        SchedulerFactory factory = new StdSchedulerFactory();
        Scheduler scheduler = factory.getScheduler();
        scheduler.start();

        JobDetail jobDetail = JobBuilder.newJob(SingleQuartzJob.class)
            .withIdentity("job", Scheduler.DEFAULT_GROUP).build();

        Date startTime = DateBuilder.nextGivenSecondDate(null, 30); // 30秒後啟動
        SimpleTrigger trigger = TriggerBuilder.newTrigger()
            .withIdentity("trigger", Scheduler.DEFAULT_GROUP)
            .startAt(startTime)
            .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(10).withRepeatCount(10)) // 每10秒,重複10次(共11次)
            .forJob(jobDetail).build();

        scheduler.scheduleJob(jobDetail, trigger);

        TimeUnit.MINUTES.sleep(3);
        scheduler.shutdown();
    }
}

4. 多執行緒並發驗證

建立多個 JobDetail/Trigger 組合,觀察輸出時間戳重疊,證明線程池並發執行。

三、持久化任務到資料庫 (為集群鋪路)

1. 建立資料庫表

使用 Quartz 官方提供的 tables_mysql.sql 在 quartz 資料庫建表。

2. 導入驅動與連線池

需額外導入:mysql-connector-java-5.1.40-bin.jar、c3p0-0.9.1.2.jar。

3. quartz.properties 配置

org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.dataSource = myDS
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/quartz?characterEncoding=utf-8
org.quartz.dataSource.myDS.user = root
org.quartz.dataSource.myDS.password = 123456
org.quartz.dataSource.myDS.maxConnections = 5

4. 驗證持久化

  • 程式停止後,資料庫 QRTZ_JOB_DETAILS、QRTZ_TRIGGERS 仍保留記錄。
  • 重新啟動相同調度器名稱,任務從上次停止處繼續執行。

四、Quartz 集群部署

1. 集群原理

多台伺服器共享同一資料庫,任務資料持久化於資料庫,各節點從資料庫獲取任務執行,實現高可用。

2. 集群配置 (quartz.properties 關鍵差異)

org.quartz.scheduler.instanceName = ClusterScheduler
org.quartz.jobStore.isClustered = true
org.quartz.scheduler.instanceId = AUTO  # 自動生成實例ID
# 資料庫配置需完全一致

3. Web 容器整合 (ServletContextListener)

public class QuartzApplicationListener implements ServletContextListener {
    private Scheduler scheduler;
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // 初始化 Scheduler、啟動、排程任務...
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        scheduler.shutdown();
    }
}

在 web.xml 註冊 Listener。

4. 實測故障轉移

啟動兩個 Tomcat (埠 8081/8082),任務在 Tomcat1 執行;停止 Tomcat1,任務自動在 Tomcat2 繼續執行,無縫切換。

總結

Quartz 提供豐富的日期/日曆工具,大幅簡化定時任務代碼。持久化 + 集群模式解決單點故障,適合任務量大、高可用需求的生產環境。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved