核心概念
- Job:實作
org.quartz.Job,業務邏輯寫在 execute()。
- JobDetail:Job 的定義描述(名稱、群組、實作類別、資料映射)。
- Trigger:觸發時機,常用
CronTrigger(Cron 表達式)或 SimpleTrigger(固定間隔)。
- Scheduler:排程核心,註冊 JobDetail + Trigger 並啟動。
1. 定義 Job
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext ctx) throws JobExecutionException {
System.out.println("執行排程任務 - " + new Date());
}
}
2. CronTrigger 範例(舊版 API)
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
JobDetail job = new JobDetailImpl("job1", "group1", MyJob.class);
CronTrigger trigger = new CronTriggerImpl("trigger1", "group1");
trigger.setCronExpression("0/2 * * * * ? *"); // 每 2 秒
sched.scheduleJob(job, trigger);
sched.start();
3. 新版 API(Quartz 2.x+)推薦寫法
Scheduler sched = StdSchedulerFactory.getDefaultScheduler();
JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("myJob", "group1")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ? *"))
.startNow()
.build();
sched.scheduleJob(job, trigger);
sched.start();
4. SimpleTrigger 固定間隔(無 Cron 表達式)
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("t1", "g1")
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInMilliseconds(2000)
.repeatForever())
.startNow()
.build();
Cron 表達式速查
* * * * * * ?
秒 分 時 日 月 周 年(可省略)
範例:
0 0 12 * * ? 每天中午 12:00
0/5 * * * * ? 每 5 秒
0 0 10,14,16 * * ? 每天 10:00, 14:00, 16:00
整合 Spring(XML 配置)
最佳實踐提醒
- Job 類別需無參建構子,且為非狀態(或使用
@PersistJobDataAfterExecution + @DisallowConcurrentExecution)。
- 生產環境建議使用資料庫持久化 JobStore(
JDBCJobStore),避免重啟遺失排程。
- 叢集模式需設定
org.quartz.jobStore.isClustered=true 且共享資料庫。
- 任務執行時間超過間隔時,預設會併發執行;若需串行,加上
@DisallowConcurrentExecution。