JobBuilder 建立。實作 Job 介面的 execute() 方法。SimpleTrigger 適合固定間隔;CronTrigger 支援複雜 Cron 表達式。建立 Java 專案,導入 quartz-2.2.1.jar、slf4j-api-1.7.22.jar、slf4j-simple-1.7.22.jar。

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());
}
}
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();
}
}
建立多個 JobDetail/Trigger 組合,觀察輸出時間戳重疊,證明線程池並發執行。
使用 Quartz 官方提供的 tables_mysql.sql 在 quartz 資料庫建表。
需額外導入:mysql-connector-java-5.1.40-bin.jar、c3p0-0.9.1.2.jar。
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
QRTZ_JOB_DETAILS、QRTZ_TRIGGERS 仍保留記錄。多台伺服器共享同一資料庫,任務資料持久化於資料庫,各節點從資料庫獲取任務執行,實現高可用。
org.quartz.scheduler.instanceName = ClusterScheduler org.quartz.jobStore.isClustered = true org.quartz.scheduler.instanceId = AUTO # 自動生成實例ID # 資料庫配置需完全一致
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。
啟動兩個 Tomcat (埠 8081/8082),任務在 Tomcat1 執行;停止 Tomcat1,任務自動在 Tomcat2 繼續執行,無縫切換。
Quartz 提供豐富的日期/日曆工具,大幅簡化定時任務代碼。持久化 + 集群模式解決單點故障,適合任務量大、高可用需求的生產環境。