1 任務調度整體流程 2 組件 調度器 :工廠類創建Scheduler,根據觸發器定義的時間規則調度任務 任務:Job表示被調度的任務 觸發器:Trigger 定義調度時間的元素,按啥時間規則執行任務。一個Job可被多個Trigger關聯,但是一個Trigger 只能關聯一個Job import o ...
1 任務調度整體流程
2 組件
- 調度器 :工廠類創建Scheduler,根據觸發器定義的時間規則調度任務
- 任務:Job表示被調度的任務
- 觸發器:Trigger 定義調度時間的元素,按啥時間規則執行任務。一個Job可被多個Trigger關聯,但是一個Trigger 只能關聯一個Job
import org.quartz.*;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzDemo {
public static void main(String[] args) throws SchedulerException {
// 創建JobDetail對象
JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
.withIdentity("myJob", "group1")
.build();
// 創建Trigger對象
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
.build();
// 創建Scheduler對象
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
// 將Job和Trigger註冊到Scheduler
scheduler.scheduleJob(jobDetail, trigger);
}
}
執行任務調度核心類QuartzSchedulerThread:
- 調度線程從JobStore中獲取需要執行的的觸發器列表,並修改觸發器的狀態
- Fire觸發器,修改觸發器信息(下次執行觸發器的時間,以及觸發器狀態),並存儲
- 最後創建具體的執行任務對象,通過worker線程池執行任務
3 集群部署方案
沒有負責集中管理的節點,而是利用資料庫行級鎖實現併發控制。
scheduler實例在集群模式先獲取{0}LOCKS表中的行鎖,MySQL獲取行鎖:
- {0}會替換為配置文件預設配置的QRTZ_
- sched_name為應用集群的實例名
- lock_name就是行級鎖名
1.3 Quartz的行級鎖
- 觸發器訪問鎖 (TRIGGER_ACCESS)
- 狀態訪問鎖(STATE_ACCESS)
解決了任務的分散式調度問題,同一個任務只能有一個節點運行,其他節點將不執行任務,當碰到大量短任務時,各節點頻繁的競爭資料庫鎖,節點越多性能越差。
本文由博客一文多發平臺 OpenWrite 發佈!