版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、分布式定時(shí)任務(wù)QUARTZ問(wèn)題引入郵易購(gòu)系統(tǒng)目前存在大量的時(shí)間定時(shí)任務(wù),這些任務(wù)的實(shí)現(xiàn)是利用LINUX的操作系統(tǒng)的時(shí)間任務(wù)工具cron調(diào)用SH命名,從而達(dá)到定時(shí)執(zhí)行的目的。目前我們的定時(shí)任務(wù)有兩個(gè)基本策略:HA(高可獲得性)和負(fù)載均衡。目前的方案,無(wú)法實(shí)現(xiàn)HA,定時(shí)任務(wù)配置所在的機(jī)器偶爾或持續(xù)拓機(jī)意味著定時(shí)任務(wù)的丟失。負(fù)載均衡也無(wú)法實(shí)現(xiàn),目前郵易購(gòu)系統(tǒng)的負(fù)載均衡是利用在命令端發(fā)起WGET請(qǐng)求時(shí)的F5調(diào)配實(shí)現(xiàn)負(fù)載均衡。而這種WEB請(qǐng)求式的程序調(diào)用在實(shí)際操作也出現(xiàn)了諸多問(wèn)題可選方案目前定時(shí)任務(wù)的可選方案,除了系統(tǒng)命令級(jí)的,還有應(yīng)用級(jí)的,也就是運(yùn)行于服務(wù)器中的應(yīng)用來(lái)觸發(fā)定時(shí)任務(wù)。主要有以下幾種:1.
2、 JDK自帶的ScheduledExecutorService2. Spring提供的ThreadPoolTaskScheduler3. spring的quertz 支持(RAM方式)4. spring的quertz 支持(DATABASE方式)對(duì)于1,2,3,都不支持集群環(huán)境下的定時(shí)任務(wù),4可支持集群環(huán)境下的定時(shí)任務(wù)。QUARTZ介紹Quartz是一個(gè)完全由java編寫的開源作業(yè)調(diào)度框架。 Quartz框架的核心是調(diào)度器。定時(shí)任務(wù)以作業(yè)的概念進(jìn)行存儲(chǔ)。調(diào)度器通過(guò)觸發(fā)器來(lái)調(diào)用作業(yè)。QUARTZ介紹調(diào)度器:Quartz框架的核心是調(diào)度器。調(diào)度器負(fù)責(zé)管理Quartz應(yīng)用運(yùn)行時(shí)環(huán)境。調(diào)度器不是靠自己
3、做所有的工作,而是依賴框架內(nèi)一些非常重要的部件。Quartz不僅僅是線程和線程管理。為確??缮炜s性,Quartz采用了基于多線程的架構(gòu)。啟動(dòng)時(shí),框架初始化一套worker線程,這套線程被調(diào)度器用來(lái)執(zhí)行預(yù)定的作業(yè)。調(diào)度器對(duì)于使用者來(lái)說(shuō)是不可見的。QUARTZ介紹作業(yè):作業(yè)就是用戶需要執(zhí)行的任務(wù)。作業(yè)可以是任何java代碼。只需你實(shí)現(xiàn)org.quartz.Job接口并且在出現(xiàn)嚴(yán)重錯(cuò)誤情況下拋出JobExecutionException異常即可。Job接口包含唯一的一個(gè)方法execute(),作業(yè)從這里開始執(zhí)行。一旦實(shí)現(xiàn)了Job接口和execute()方法,當(dāng)Quartz確定該是作業(yè)運(yùn)行的時(shí)候,它將
4、調(diào)用你的作業(yè)。Execute()方法內(nèi)就完全是你要做的事情。QUARTZ介紹作業(yè)存儲(chǔ):Quartz提供兩種基本作業(yè)存儲(chǔ)類型。第一種類型叫做RAMJobStore,它利用通常的內(nèi)存來(lái)持久化調(diào)度程序信息。這種作業(yè)存儲(chǔ)類型最容易配置、構(gòu)造和運(yùn)行。對(duì)許多應(yīng)用來(lái)說(shuō),這種作業(yè)存儲(chǔ)已經(jīng)足夠了。然而,因?yàn)檎{(diào)度程序信息是存儲(chǔ)在被分配給JVM的內(nèi)存里面,所以,當(dāng)應(yīng)用程序停止運(yùn)行時(shí),所有調(diào)度信息將被丟失。如果你需要在重新啟動(dòng)之間持久化調(diào)度信息,則將需要第二種類型的作業(yè)存儲(chǔ)。QUARTZ介紹第二種類型的作業(yè)存儲(chǔ)實(shí)際上提供兩種不同的實(shí)現(xiàn),但兩種實(shí)現(xiàn)一般都稱為JDBC作業(yè)存儲(chǔ)。兩種JDBC作業(yè)存儲(chǔ)都需要JDBC驅(qū)動(dòng)程序和
5、后臺(tái)數(shù)據(jù)庫(kù)來(lái)持久化調(diào)度程序信息。這兩種類型的不同在于你是否想要控制數(shù)據(jù)庫(kù)事務(wù)或這釋放控制給應(yīng)用服務(wù)器例如BEAs WebLogic或Jboss。(這類似于J2EE領(lǐng)域中,Bean管理的事務(wù)和和容器管理事務(wù)之間的區(qū)別)QUARTZ介紹觸發(fā)器:Quartz中的觸發(fā)器用來(lái)告訴調(diào)度程序作業(yè)什么時(shí)候觸發(fā)??蚣芴峁┝艘幌盗杏|發(fā)器類型,但兩個(gè)最常用的是SimpleTrigger和CronTrigger。SimpleTrigger為需要簡(jiǎn)單打火調(diào)度而設(shè)計(jì)。典型地,如果你需要在給定的時(shí)間和重復(fù)次數(shù)或者兩次打火之間等待的秒數(shù)打火一個(gè)作業(yè),那么SimpleTrigger適合你。另一方面,如果你有許多復(fù)雜的作業(yè)調(diào)度,
6、那么或許需要CronTrigger。QUARTZ介紹在絕大多數(shù)場(chǎng)景中,開發(fā)者只需要定制出自己的作業(yè)和配置觸發(fā)器。需要說(shuō)明的一點(diǎn)是,在目前的版本中,如果要運(yùn)用QUARTZ的集群特性,必須使用作業(yè)的JDBC存儲(chǔ)形式。SPRING與QUARTZ集成Spring提供了對(duì)QUARTZ的支持。使用者需要做的就是提供QUARTZ運(yùn)行時(shí)所需要的作業(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運(yùn)行時(shí)的環(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性能驗(yàn)證我們通過(guò)幾個(gè)簡(jiǎn)單的測(cè)試,來(lái)驗(yàn)證一下QUARTZ所具備的特性。1. quartz集群中的某個(gè)節(jié)點(diǎn)停機(jī),是否其他節(jié)點(diǎn)可以取代執(zhí)行測(cè)試環(huán)境:QUARTZ做集群配置,開啟一個(gè)TOMCAT服務(wù),接受HESSIAN請(qǐng)求。兩個(gè)客戶端(一臺(tái)機(jī)器上),相同觸發(fā)器,請(qǐng)求間隔兩個(gè)節(jié)點(diǎn)均為30秒操作步驟:開啟兩個(gè)客戶端,一段時(shí)間后,停止其中一個(gè)客戶
12、端,再過(guò)一段時(shí)間,重新開啟該客戶端觀察結(jié)果:NODE1開啟后,每隔30秒向服務(wù)器發(fā)送一次請(qǐng)求。NODE2開啟后,NODE2的任務(wù)沒有被執(zhí)行,仍然為NODE1每隔30秒發(fā)送一次請(qǐng)求,當(dāng)NODE1停止后,一段時(shí)間后,NODE2開始發(fā)送請(qǐng)求,服務(wù)端收到請(qǐng)求并記錄下來(lái)。重新開始NODE1后,服務(wù)端仍然只收到NODE2的請(qǐng)求。結(jié)論:QUARTZ集群中,一個(gè)節(jié)點(diǎn)無(wú)法完成的任務(wù),會(huì)被集群中擁有相同任務(wù)的節(jié)點(diǎn)取代執(zhí)行性能驗(yàn)證2. QUARTZ中如何識(shí)別相同的任務(wù)測(cè)試環(huán)境:QUARTZ做集群配置,開啟一個(gè)TOMCAT服務(wù),接受HESSIAN請(qǐng)求。兩個(gè)客戶端(一臺(tái)機(jī)器上),不同觸發(fā)器名稱,請(qǐng)求間隔兩個(gè)節(jié)點(diǎn)均為30
13、秒操作步驟:開啟兩個(gè)客戶端,一段時(shí)間后,停止其中一個(gè)客戶端,再過(guò)一段時(shí)間,重新開啟該客戶端觀察結(jié)果:NODE1開啟后,每隔30秒向服務(wù)器發(fā)送一次請(qǐng)求。NODE2開啟后,NODE2開始每隔30秒發(fā)送一次請(qǐng)求,當(dāng)NODE1停止后,NODE2繼續(xù)發(fā)送請(qǐng)求,服務(wù)端收到請(qǐng)求并記錄下來(lái)。重新開始NODE1后,NODE1,NODE2各自每30秒發(fā)送一次請(qǐng)求結(jié)論:QUARTZ調(diào)度是通過(guò)觸發(fā)器來(lái)識(shí)別不同的任務(wù),如果想某個(gè)任務(wù)獲得集群環(huán)境下的高穩(wěn)定性,需要在不同的節(jié)點(diǎn)定義相同的觸發(fā)器,并執(zhí)行相同的作業(yè)。性能驗(yàn)證3. 節(jié)點(diǎn)主機(jī)時(shí)間有差異的情況下,定時(shí)任務(wù)是否會(huì)重復(fù)執(zhí)行測(cè)試環(huán)境:,開啟一個(gè)TOMCAT服務(wù),接受HES
14、SIAN請(qǐng)求。兩個(gè)客戶端分屬兩臺(tái)機(jī)器,任務(wù)QUARTZ做集群配置執(zhí)行時(shí)間相同(例如都是14:00),兩臺(tái)主機(jī)的系統(tǒng)時(shí)間相差1分鐘操作步驟:將兩臺(tái)主機(jī)上的客戶端都開啟,等待到達(dá)時(shí)間點(diǎn)后定時(shí)任務(wù)的觸發(fā)觀察結(jié)果:當(dāng)NODE1的到達(dá)指定時(shí)間觸發(fā)定時(shí)任務(wù),并執(zhí)行后,NODE2到達(dá)預(yù)定時(shí)間時(shí),未觸發(fā)定時(shí)任務(wù)結(jié)論:相同定時(shí)任務(wù)當(dāng)一個(gè)節(jié)點(diǎn)執(zhí)行后,另一個(gè)節(jié)點(diǎn)不會(huì)執(zhí)行。優(yōu)點(diǎn)一. 實(shí)現(xiàn)HAQUARTZ在集群開啟的情況下,會(huì)將定時(shí)任務(wù)序列化到數(shù)據(jù)庫(kù)中存儲(chǔ),當(dāng)集群中某個(gè)節(jié)點(diǎn)的觸發(fā)器需要執(zhí)行某項(xiàng)任務(wù)時(shí),會(huì)去數(shù)據(jù)庫(kù)獲取該任務(wù),并將執(zhí)行狀態(tài)保留在數(shù)據(jù)庫(kù)中。如果因?yàn)槟撤N原因,該任務(wù)未能在此節(jié)點(diǎn)上執(zhí)行,另一節(jié)點(diǎn)會(huì)獲取到該狀態(tài)并補(bǔ)充執(zhí)行。從而保證所有的時(shí)間任務(wù)最終都能執(zhí)行完畢(除非所有節(jié)點(diǎn)都拓機(jī))優(yōu)點(diǎn)二. 均衡負(fù)載可以將不同
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安置房爆破施工合同
- 建筑工程建設(shè)中的給排水管道防滲漏施工分析
- 石河子大學(xué)《園林綠地系統(tǒng)規(guī)劃》2022-2023學(xué)年第一學(xué)期期末試卷
- 國(guó)慶假期防溺水教育活動(dòng)總結(jié)7篇
- 學(xué)校運(yùn)動(dòng)場(chǎng)改造施工組織設(shè)計(jì)
- 石河子大學(xué)《籃球教學(xué)訓(xùn)練理論與實(shí)踐》2022-2023學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《工業(yè)藥劑學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《健身指導(dǎo)與訓(xùn)練》2021-2022學(xué)年第一學(xué)期期末試卷
- 沈陽(yáng)理工大學(xué)《數(shù)字圖像處理技術(shù)》2022-2023學(xué)年期末試卷
- 沈陽(yáng)理工大學(xué)《馬克思主義與社會(huì)科學(xué)方法論》2021-2022學(xué)年第一學(xué)期期末試卷
- VDA6.3過(guò)程審核員培訓(xùn)考核試卷及答案(一)
- 電阻焊原理及工藝(壓力焊技術(shù)知識(shí)全案)
- 工程制圖 第4章 截交線和相貫線
- 新高考高中家長(zhǎng)會(huì)課件
- 城市介紹(重慶)課件
- 六年級(jí)上冊(cè)數(shù)學(xué)總復(fù)習(xí)看圖列式計(jì)算題
- 常用的氮肥硫酸銨課件
- 2022版義務(wù)教育(科學(xué))課程標(biāo)準(zhǔn)(含2022年新增和修訂部分)
- 土石方報(bào)告模板
- JC01基礎(chǔ)心理學(xué)單科作業(yè)題匯總(含解析)
- 養(yǎng)老院院內(nèi)感染防控員課件
評(píng)論
0/150
提交評(píng)論