首先介紹一下Quartz啟動過程和幾個核心類的主要職責(zé)芥丧,在其他的文章里葛账,分別詳細的介紹這幾個核心類。
1氛赐、通常,調(diào)用StdSchedulerFactory#getDefaultScheduler()先舷,得到一StdScheduler艰管。在這個過程中,間接的調(diào)用了instantiate()方法蒋川,這個方法完成了框架所有組件的創(chuàng)建和初始化牲芋。
2、Scheduler 是框架的主要接口捺球,用戶使用它完成大部分工作缸浦。調(diào)用Scheduler#start()啟動框架。
3氮兵、QuartzScheduler 中封裝了對框架的大部分操作裂逐,StdScheduler中所有的方法都是調(diào)用QuartzScheduler中的方法的實現(xiàn)。例如:
public void start() throwsSchedulerException {
????sched.start();
}
? ? 在QuartzScheduler#start()中胆剧,首先通知所有監(jiān)聽器啟動消息絮姆,然后啟動插件、JobStore和通知QuartzSchedulerThread正式啟動秩霍,最后通知監(jiān)聽器啟動完成篙悯。
4、QuartzSchedulerThread 繼承自 Thread铃绒, 它的run方法是整個調(diào)度的核心鸽照,在run方法中, 會循環(huán)去數(shù)據(jù)庫查詢某一段時間里最早觸發(fā)的trigger颠悬,并且異步去執(zhí)行對應(yīng)的job實現(xiàn)類矮燎。
5定血、JobRunShell 繼承自Runnable,它是對一個需要執(zhí)行的job子類的封裝诞外, 在QuartzSchedulerThread#run方法創(chuàng)建澜沟,并調(diào)用線程池中的線程去執(zhí)行,在它的initialize(QuartzScheduler sched)方法中峡谊,用反射生成了job類茫虽,run方法是一個job被執(zhí)行的邏輯。
6既们、SimpleThreadPool濒析,是默認的線程池,它有一個內(nèi)部類WorkerThread繼承自Thread啥纸,每一個WorkerThread類代表線程池中的一個線程号杏。通過SimpleThreadPool#runInThread方法提供異步處理。
7斯棒、JobStore盾致, 給QuartzScheduler提供了Job和Trigger的存儲機制,默認使用RAMJobStore名船,數(shù)據(jù)保存在內(nèi)存中绰上,配置了數(shù)據(jù)庫時,所有的數(shù)據(jù)庫操作封裝在了JobStoreSupport中渠驼。JobStoreSupport是一個抽象類,其中有兩個內(nèi)部類鉴腻,都繼承自Thread迷扇,ClusterManager用于維護集群,MisfireHandler封裝了Misfire 后的Trigger的處理爽哎。
8蜓席、QuartzSchedulerResources,這個類保存了所有的運行時資源课锌,包括ThreadPool厨内,JobStore等。
注:1渺贤、系列文章使用的是Quartz版本為 2.3.1
? ? ? ? 2雏胃、文章所有的解析基于使用數(shù)據(jù)庫持久化