學(xué)習(xí)-llp分布式定時任務(wù)quartz spring_第1頁
學(xué)習(xí)-llp分布式定時任務(wù)quartz spring_第2頁
學(xué)習(xí)-llp分布式定時任務(wù)quartz spring_第3頁
學(xué)習(xí)-llp分布式定時任務(wù)quartz spring_第4頁
學(xué)習(xí)-llp分布式定時任務(wù)quartz spring_第5頁
免費預(yù)覽已結(jié)束,剩余20頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、分布式定時任務(wù)QUARTZ問題引入郵易購系統(tǒng)目前存在大量的時間定時任務(wù),這些任務(wù)的實現(xiàn)是利用LINUX的操作系統(tǒng)的時間任務(wù)工具cron調(diào)用SH命名,從而達(dá)到定時執(zhí)行的目的。目前我們的定時任務(wù)有兩個基本策略:HA(高可獲得性)和負(fù)載均衡。目前的方案,無法實現(xiàn)HA,定時任務(wù)配置所在的機器偶爾或持續(xù)拓機意味著定時任務(wù)的丟失。負(fù)載均衡也無法實現(xiàn),目前郵易購系統(tǒng)的負(fù)載均衡是利用在命令端發(fā)起WGET請求時的F5調(diào)配實現(xiàn)負(fù)載均衡。而這種WEB請求式的程序調(diào)用在實際操作也出現(xiàn)了諸多問題可選方案目前定時任務(wù)的可選方案,除了系統(tǒng)命令級的,還有應(yīng)用級的,也就是運行于服務(wù)器中的應(yīng)用來觸發(fā)定時任務(wù)。主要有以下幾種:1.

2、 JDK自帶的ScheduledExecutorService2. Spring提供的ThreadPoolTaskScheduler3. spring的quertz 支持(RAM方式)4. spring的quertz 支持(DATABASE方式)對于1,2,3,都不支持集群環(huán)境下的定時任務(wù),4可支持集群環(huán)境下的定時任務(wù)。QUARTZ介紹Quartz是一個完全由java編寫的開源作業(yè)調(diào)度框架。 Quartz框架的核心是調(diào)度器。定時任務(wù)以作業(yè)的概念進(jìn)行存儲。調(diào)度器通過觸發(fā)器來調(diào)用作業(yè)。QUARTZ介紹調(diào)度器:Quartz框架的核心是調(diào)度器。調(diào)度器負(fù)責(zé)管理Quartz應(yīng)用運行時環(huán)境。調(diào)度器不是靠自己

3、做所有的工作,而是依賴框架內(nèi)一些非常重要的部件。Quartz不僅僅是線程和線程管理。為確??缮炜s性,Quartz采用了基于多線程的架構(gòu)。啟動時,框架初始化一套worker線程,這套線程被調(diào)度器用來執(zhí)行預(yù)定的作業(yè)。調(diào)度器對于使用者來說是不可見的。QUARTZ介紹作業(yè):作業(yè)就是用戶需要執(zhí)行的任務(wù)。作業(yè)可以是任何java代碼。只需你實現(xiàn)org.quartz.Job接口并且在出現(xiàn)嚴(yán)重錯誤情況下拋出JobExecutionException異常即可。Job接口包含唯一的一個方法execute(),作業(yè)從這里開始執(zhí)行。一旦實現(xiàn)了Job接口和execute()方法,當(dāng)Quartz確定該是作業(yè)運行的時候,它將

4、調(diào)用你的作業(yè)。Execute()方法內(nèi)就完全是你要做的事情。QUARTZ介紹作業(yè)存儲:Quartz提供兩種基本作業(yè)存儲類型。第一種類型叫做RAMJobStore,它利用通常的內(nèi)存來持久化調(diào)度程序信息。這種作業(yè)存儲類型最容易配置、構(gòu)造和運行。對許多應(yīng)用來說,這種作業(yè)存儲已經(jīng)足夠了。然而,因為調(diào)度程序信息是存儲在被分配給JVM的內(nèi)存里面,所以,當(dāng)應(yīng)用程序停止運行時,所有調(diào)度信息將被丟失。如果你需要在重新啟動之間持久化調(diào)度信息,則將需要第二種類型的作業(yè)存儲。QUARTZ介紹第二種類型的作業(yè)存儲實際上提供兩種不同的實現(xiàn),但兩種實現(xiàn)一般都稱為JDBC作業(yè)存儲。兩種JDBC作業(yè)存儲都需要JDBC驅(qū)動程序和

5、后臺數(shù)據(jù)庫來持久化調(diào)度程序信息。這兩種類型的不同在于你是否想要控制數(shù)據(jù)庫事務(wù)或這釋放控制給應(yīng)用服務(wù)器例如BEAs WebLogic或Jboss。(這類似于J2EE領(lǐng)域中,Bean管理的事務(wù)和和容器管理事務(wù)之間的區(qū)別)QUARTZ介紹觸發(fā)器:Quartz中的觸發(fā)器用來告訴調(diào)度程序作業(yè)什么時候觸發(fā)??蚣芴峁┝艘幌盗杏|發(fā)器類型,但兩個最常用的是SimpleTrigger和CronTrigger。SimpleTrigger為需要簡單打火調(diào)度而設(shè)計。典型地,如果你需要在給定的時間和重復(fù)次數(shù)或者兩次打火之間等待的秒數(shù)打火一個作業(yè),那么SimpleTrigger適合你。另一方面,如果你有許多復(fù)雜的作業(yè)調(diào)度,

6、那么或許需要CronTrigger。QUARTZ介紹在絕大多數(shù)場景中,開發(fā)者只需要定制出自己的作業(yè)和配置觸發(fā)器。需要說明的一點是,在目前的版本中,如果要運用QUARTZ的集群特性,必須使用作業(yè)的JDBC存儲形式。SPRING與QUARTZ集成Spring提供了對QUARTZ的支持。使用者需要做的就是提供QUARTZ運行時所需要的作業(yè)及觸發(fā)器的相關(guān)信息。下面看一段配置: SPRING與QUARTZ集成 work 10,15,20,25,30,35,40,45,50,55 * * * * ? SPRING與QUARTZ集成 在這段配置里面定義了作業(yè)和觸發(fā)器,這也是和業(yè)務(wù)相關(guān)的信息。SPRING與Q

7、UARTZ集成另外,我們還需要一些QUARTZ運行時的環(huán)境信息,這些信息被保存在配置文件perties里#=# Configure Main Scheduler Properties #=org.quartz.scheduler.instanceName = DefaultQuartzSchedulerorg.quartz.scheduler.instanceId = AUTOorg.quartz.scheduler.rmi.export = xy = falseorg.quartz.scheduler.wr

8、apJobExecutionInUserTransaction = falseSPRING與QUARTZ集成# Configure ThreadPool #=org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount = 10org.quartz.threadPool.threadPriority = 5org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = tru

9、e# Configure JobStore #=org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegateorg.quartz.jobStore.misfireThreshold = 60000org.quartz.jobStore.useProperties = falseorg.quartz.jobStore.tablePrefix

10、= QRTZ_org.quartz.jobStore.dataSource = myDSorg.quartz.jobStore.isClustered = trueorg.quartz.jobStore.clusterCheckinInterval = 15000SPRING與QUARTZ集成# Configure DataSource#=org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriverorg.quartz.dataSource.myDS.URL = jdbc:oracle:thin::15

11、21:orclorg.quartz.dataSource.myDS.user = demoorg.quartz.dataSource.myDS.password = demoorg.quartz.dataSource.myDS.maxConnections = 10性能驗證我們通過幾個簡單的測試,來驗證一下QUARTZ所具備的特性。1. quartz集群中的某個節(jié)點停機,是否其他節(jié)點可以取代執(zhí)行測試環(huán)境:QUARTZ做集群配置,開啟一個TOMCAT服務(wù),接受HESSIAN請求。兩個客戶端(一臺機器上),相同觸發(fā)器,請求間隔兩個節(jié)點均為30秒操作步驟:開啟兩個客戶端,一段時間后,停止其中一個客戶

12、端,再過一段時間,重新開啟該客戶端觀察結(jié)果:NODE1開啟后,每隔30秒向服務(wù)器發(fā)送一次請求。NODE2開啟后,NODE2的任務(wù)沒有被執(zhí)行,仍然為NODE1每隔30秒發(fā)送一次請求,當(dāng)NODE1停止后,一段時間后,NODE2開始發(fā)送請求,服務(wù)端收到請求并記錄下來。重新開始NODE1后,服務(wù)端仍然只收到NODE2的請求。結(jié)論:QUARTZ集群中,一個節(jié)點無法完成的任務(wù),會被集群中擁有相同任務(wù)的節(jié)點取代執(zhí)行性能驗證2. QUARTZ中如何識別相同的任務(wù)測試環(huán)境:QUARTZ做集群配置,開啟一個TOMCAT服務(wù),接受HESSIAN請求。兩個客戶端(一臺機器上),不同觸發(fā)器名稱,請求間隔兩個節(jié)點均為30

13、秒操作步驟:開啟兩個客戶端,一段時間后,停止其中一個客戶端,再過一段時間,重新開啟該客戶端觀察結(jié)果:NODE1開啟后,每隔30秒向服務(wù)器發(fā)送一次請求。NODE2開啟后,NODE2開始每隔30秒發(fā)送一次請求,當(dāng)NODE1停止后,NODE2繼續(xù)發(fā)送請求,服務(wù)端收到請求并記錄下來。重新開始NODE1后,NODE1,NODE2各自每30秒發(fā)送一次請求結(jié)論:QUARTZ調(diào)度是通過觸發(fā)器來識別不同的任務(wù),如果想某個任務(wù)獲得集群環(huán)境下的高穩(wěn)定性,需要在不同的節(jié)點定義相同的觸發(fā)器,并執(zhí)行相同的作業(yè)。性能驗證3. 節(jié)點主機時間有差異的情況下,定時任務(wù)是否會重復(fù)執(zhí)行測試環(huán)境:,開啟一個TOMCAT服務(wù),接受HES

14、SIAN請求。兩個客戶端分屬兩臺機器,任務(wù)QUARTZ做集群配置執(zhí)行時間相同(例如都是14:00),兩臺主機的系統(tǒng)時間相差1分鐘操作步驟:將兩臺主機上的客戶端都開啟,等待到達(dá)時間點后定時任務(wù)的觸發(fā)觀察結(jié)果:當(dāng)NODE1的到達(dá)指定時間觸發(fā)定時任務(wù),并執(zhí)行后,NODE2到達(dá)預(yù)定時間時,未觸發(fā)定時任務(wù)結(jié)論:相同定時任務(wù)當(dāng)一個節(jié)點執(zhí)行后,另一個節(jié)點不會執(zhí)行。優(yōu)點一. 實現(xiàn)HAQUARTZ在集群開啟的情況下,會將定時任務(wù)序列化到數(shù)據(jù)庫中存儲,當(dāng)集群中某個節(jié)點的觸發(fā)器需要執(zhí)行某項任務(wù)時,會去數(shù)據(jù)庫獲取該任務(wù),并將執(zhí)行狀態(tài)保留在數(shù)據(jù)庫中。如果因為某種原因,該任務(wù)未能在此節(jié)點上執(zhí)行,另一節(jié)點會獲取到該狀態(tài)并補充執(zhí)行。從而保證所有的時間任務(wù)最終都能執(zhí)行完畢(除非所有節(jié)點都拓機)優(yōu)點二. 均衡負(fù)載可以將不同

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論