Quartz 是開源企業級任務調度框架,核心抽象三大組件:Job(任務)、Trigger(觸發器)、Scheduler(調度器)。本文通過一個「日程提醒」完整示例,講解核心 API 與 Cron 表達式用法。
org.quartz.Job 接口,execute(JobExecutionContext) 執行業務邏輯。CronTrigger 支援 Cron 表達式。public class Plan {
private String date;
private String task;
// getter/setter/toString/構造器省略
}
public class RemindService {
public void printPlan(String userName) {
List<Plan> plans = getPlansFormToday(userName);
System.out.println(userName + " //");
for (Plan p : plans) System.out.println(p + " \\\\");
}
private List<Plan> getPlansFormToday(String userName) {
// 模擬查詢
List<Plan> list = new ArrayList<>();
list.add(new Plan("2016-11-3 14:31:11", "陶研會|地點:會議室C01"));
list.add(new Plan("2016-11-3 14:31:20", "總裁辦公室|地點:總裁辦公室"));
return list;
}
}
public class RemindJob implements Job {
private RemindService service = new RemindService();
public void execute(JobExecutionContext context) throws JobExecutionException {
service.printPlan("你好!");
// 可從 context 獲取參數、觸發器名、任務名等
JobDataMap map = context.getJobDetail().getJobDataMap();
System.out.println(map.get("happykey"));
System.out.println("TriggerName: " + context.getTrigger().getKey().getName());
System.out.println("JobName: " + context.getJobDetail().getKey().getName());
}
// getter/setter for service
}
public class Test {
public static void main(String[] args) throws SchedulerException {
// 1. 定義 JobDetail
JobDetail job = JobBuilder.newJob(RemindJob.class)
.withIdentity("job1", "group1").build();
job.getJobDataMap().put("happykey", "自定義參數值");
// 2. 定義 CronTrigger:每月第一個週四 16:17 觸發(2016年)
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "myTriggerGroup")
.withSchedule(CronScheduleBuilder.cronSchedule("0 17 16 ? * 5#1 2016"))
.build();
// 3. 調度器啟動
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(job, trigger);
scheduler.start();
// 測試用睡眠,生產環境不關閉
Thread.sleep(60_000);
scheduler.shutdown();
}
}
JobBuilder.newJob():構建 JobDetail,設置身份標識、持久化參數。TriggerBuilder + CronScheduleBuilder:靈活構建複雜時間規則。StdSchedulerFactory:獲取 Scheduler 實例。scheduler.scheduleJob(job, trigger):註冊並開始調度。| 表達式 | 含義 |
|---|---|
0 0 12 * * ? | 每天中午 12:00 |
0 15 10 ? * MON-FRI | 周一至周五 10:15 |
0 0 12 ? * 6L | 每月最後一個週六 12:00 |
0 15 10 ? * 6#3 | 每月第三個週五 10:15 |
Quartz 功能強大,支援集群、持久化、事務、監聽器等企業級特性。掌握核心三組件與 Cron 表達式,即可覆蓋 90% 以上的定時任務場景。