Quartz 是 Java 開源作業排程框架,核心三大組件:Job(工作)、Trigger(觸發器)、Scheduler(調度器)。本文示範完整整合流程與 Cron 運算式應用。
| 組件 | 說明 |
|---|---|
| Job | 介面,唯一方法 execute(JobExecutionContext),實作具體業務邏輯 |
| JobDetail | Job 描述類,含名稱、群組、實作類、JobDataMap 等靜態資訊 |
| Trigger | 定義觸發時間規則:SimpleTrigger(固定間隔)、CronTrigger(Cron 運算式) |
| Scheduler | 調度核心,負責註冊 JobDetail + Trigger 並啟動排程 |
public class Plan {
private String date, task;
// getter/setter/建構子/toString 略
}
public class RemindService {
public List getPlansForToday() {
// 實際應從 DB 查詢,此處模擬資料
List list = new ArrayList<>();
list.add(new Plan("2016-11-03", "專案會議"));
list.add(new Plan("2016-11-04", "程式碼審查"));
return list;
}
public void outputPlans() {
for (Plan p : getPlansForToday())
System.out.println("計劃:" + p.getDate() + " " + p.getTask());
}
}
public class RemindJob implements Job {
private RemindService service = new RemindService();
public void execute(JobExecutionContext ctx) throws JobExecutionException {
service.outputPlans();
}
// getter/setter 供 Spring 注入
}
public class TestJob {
public static void doRemind() throws SchedulerException {
// 1. 定義 JobDetail
JobDetail job = JobBuilder.newJob(RemindJob.class)
.withIdentity("job1", "group1").build();
// 2. 定義 CronTrigger:每週五 16:34:00 執行(2016 年)
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0 34 16 ? * 5#1 2016"))
.build();
// 3. 取得 Scheduler 並啟動
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(job, trigger);
scheduler.start();
// 測試用:睡眠 10 秒後關閉
// Thread.sleep(10000); scheduler.shutdown();
}
public static void main(String[] args) throws Exception { doRemind(); }
}
格式:秒 分 時 日 月 週 [年](6 或 7 個欄位)
| 欄位 | 允許值 | 特殊符號 |
|---|---|---|
| 秒 | 0-59 | , - * / |
| 分 | 0-59 | , - * / |
| 時 | 0-23 | , - * / |
| 日 | 1-31 | , - * ? / L W |
| 月 | 1-12 / JAN-DEC | , - * / |
| 週 | 1-7 / SUN-SAT | , - * ? / L # |
| 年(可選) | 1970-2099 | , - * / |
*:所有值?:不指定值(日/週 二擇一)-:範圍,如 10-12,:列舉,如 MON,WED,FRI/:增量,如 0/15 每 15 分鐘L:最後一天/最後一個週XW:最近工作日#:第 N 個週X,如 5#1 = 月內第一個週五0 34 16 ? * 5#1 2016 │ │ │ │ │ │ └ 年份 2016 │ │ │ │ │ └ 月份:每月 │ │ │ │ └ 週:月內第 1 個週五 (5=FRIDAY, #1=第1個) │ │ │ └ 日:不指定 (?) │ │ └ 時:16 點 │ └ 分:34 分 └ 秒:0 秒
SchedulerFactoryBean 管理 Scheduler 生命週期@Autowired 注入 Service@Configuration 中宣告
