先解釋一下什么叫調(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è)的地方跌穗。