先解釋一下什么叫調(diào)度:(來自維基百科)調(diào)度在計算機中是分配工作所需資源的方法,這里的資源可以指虛擬的計算資源,如線程、進程或數(shù)據(jù)流;也可以指硬件資源,如處理器、網(wǎng)絡(luò)連接或擴展卡。進行調(diào)度工作的程序叫調(diào)度器。
分布式與集群:(引用)小飯店原來只有一個廚師,切菜洗菜備料炒菜全干。后來客人多了,廚房一個廚師忙不過來,又請了個廚師,兩個廚師都能炒一樣的菜,這兩個廚師的關(guān)系是集群。為了讓廚師專心炒菜,把菜做到極致,又請了個配菜師負責切菜,備菜,備料,廚師和配菜師的關(guān)系是分布式,一個配菜師也忙不過來了,又請了個配菜師,兩個配菜師關(guān)系是集群。
可參考這篇文章:https://blog.csdn.net/u013142781/article/details/51307229
Quartz基本概念:
它是一個優(yōu)秀的開源調(diào)度框架,有強大的調(diào)度功能,應(yīng)用方式靈活(支持任務(wù)和調(diào)度的各種組合方式,支持調(diào)度數(shù)據(jù)的多種儲存方式),有分布式和集群能力。而且,Quartz是Spring默認的調(diào)度框架,很容易與Spring集成實現(xiàn)靈活可配置的調(diào)度功能。
Quartz調(diào)度核心元素:
1、Scheduler:任務(wù)調(diào)度器,實際執(zhí)行任務(wù)調(diào)度的控制器,在Spring中通過SchedulerFactoryBean封裝起來。
2、Trigger:觸發(fā)器,用于定義任務(wù)調(diào)度的時間規(guī)則,有SimpleTrigger,CronTrigger,DateIntervalTrigger和NthIncludedDayTrigger,其中CronTrigger用的比較多。
3、Calendar:它是一些日歷特定時間點的集合。一個trigger可以包含多個Calendar,以便排除或包含某些時間點。
4、JobDetail:描述Job實現(xiàn)類及其它相關(guān)的靜態(tài)信息,如Job名字、關(guān)聯(lián)監(jiān)聽器等信息。在spring中有JobDetailFactoryBean和 MethodInvokingJobDetailFactoryBean兩種實現(xiàn),如果任務(wù)調(diào)度只需要執(zhí)行某個類的某個方法,就可以通過MethodInvokingJobDetailFactoryBean來調(diào)用。
5、Job:是一個接口,只有一個方法void execute(JobExecutionContext context),開發(fā)者實現(xiàn)該接口定義運行任務(wù),JobExecutionContext類提供了調(diào)度上下文的各種信息。Job運行時的信息保存在JobDataMap實例中。實現(xiàn)Job接口的任務(wù),默認是無狀態(tài)的,若要將Job設(shè)置成有狀態(tài)的,在quartz中是給實現(xiàn)的Job添加@DisallowConcurrentExecution注解(以前是實現(xiàn)StatefulJob接口,現(xiàn)在已被Deprecated),在與spring結(jié)合中可以在spring配置文件的job detail中配置concurrent參數(shù)。
Quartz集群配置:
主要通過數(shù)據(jù)庫表來感知其他的應(yīng)用的,各個節(jié)點之間并沒有直接的通信。只有使用持久的JobStore才能完成Quartz集群。具體的表不加描述。
Quartz基本原理:
主要就是三個核心元素:Scheduler、trigger、job,Scheduler是實際執(zhí)行調(diào)度的控制器,trigger和Job是任務(wù)調(diào)度的元數(shù)據(jù)。
Scheduler:主要有三種RemoteMBeanScheduler, RemoteScheduler 和 StdScheduler。主要由Scheduler工廠創(chuàng)建DirectSchedulerFactory 或者 StdSchedulerFactory。 第二種工廠 StdSchedulerFactory 使用較多。
trigger:用于定義調(diào)度時間,按照什么時間規(guī)則去執(zhí)行任務(wù)。Quartz 中主要提供了四種類型的 trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,和 NthIncludedDayTrigger。
Job:表示被調(diào)度的任務(wù)。主要有兩種類型的 job:無狀態(tài)的(stateless)和有狀態(tài)的(stateful)。對于同一個 trigger 來說,有狀態(tài)的 job 不能被并行執(zhí)行,只有上一次觸發(fā)的任務(wù)被執(zhí)行完之后,才能觸發(fā)下一次執(zhí)行。Job 主要有兩種屬性:volatility 和 durability,其中 volatility 表示任務(wù)是否被持久化到數(shù)據(jù)庫存儲,而 durability 表示在沒有 trigger 關(guān)聯(lián)的時候任務(wù)是否被保留。兩者都是在值為 true 的時候任務(wù)被持久化或保留。一個 job 可以被多個 trigger 關(guān)聯(lián),但是一個 trigger 只能關(guān)聯(lián)一個 job。
工作原理:
IOC容器初始化時(用Spring與Quartz結(jié)合的)會創(chuàng)建并初始化Quartz線程池(TreadPool),并啟動它。剛啟動時線程池中每個線程都處于等待狀態(tài),等待外界給他分配Runnable(持有作業(yè)對象的線程)。
初始化并啟動Quartz的主線程(QuartzSchedulerThread),該線程自啟動后就會等待外界的信號量開始工作。外界給出工作信號量之后,該主線程的run方法才實質(zhì)上開始工作。run中會獲取JobStore中下一次要觸發(fā)的作業(yè),拿到之后會一直等待到該作業(yè)的真正觸發(fā)時間,然后將該作業(yè)包裝成一個JobRunShell對象(該對象實現(xiàn)了Runnable接口,其實看是上面TreadPool中等待外界分配給他的Runnable),然后將剛創(chuàng)建的JobRunShell交給線程池,由線程池負責執(zhí)行作業(yè)。
線程池收到Runnable后,從線程池一個線程啟動Runnable,然后將該線程回收至空閑線程中。
JobRunShell對象的run方法就是最終通過反射調(diào)用作業(yè)的地方。