国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

任務(wù)定時(shí)調(diào)度在企業(yè)級(jí)開(kāi)發(fā)中的研究

2015-04-25 07:28孫忠林
電子科技 2015年10期
關(guān)鍵詞:任務(wù)調(diào)度線程容器

王 秀,孫忠林,姜 莉

(山東科技大學(xué) 信息科學(xué)與工程學(xué)院,山東 青島266590)

在企業(yè)級(jí)應(yīng)用開(kāi)發(fā)中,為了提高系統(tǒng)的效率,需要進(jìn)行基于給定時(shí)間點(diǎn),給定時(shí)間間隔或者給定執(zhí)行次數(shù)的任務(wù)。隨著業(yè)務(wù)流程復(fù)雜性的提升,自動(dòng)化流程的益處顯現(xiàn)更加明顯,如企業(yè)網(wǎng)站非法用戶解鎖功能,需要實(shí)現(xiàn)每30 min對(duì)非法IP解鎖的需求,這些任務(wù)無(wú)需人機(jī)交互,只需在系統(tǒng)后臺(tái)運(yùn)行。任務(wù)調(diào)度能較好滿足企業(yè)應(yīng)用的需求,更好地實(shí)現(xiàn)自動(dòng)化。在Java的應(yīng)用開(kāi)發(fā)有多種多樣的方法提供定時(shí)任務(wù)調(diào)度。

本文從實(shí)現(xiàn)原理和程序設(shè)計(jì)的角度分析3種任務(wù)調(diào)度的方式,包括使用JDK Timer,使用基于ScheduledExecuter接口的實(shí)現(xiàn)和使用Quartz調(diào)度器,滿足復(fù)雜多樣的任務(wù)定時(shí)調(diào)度。JDK Timer適用于特定時(shí)間點(diǎn)執(zhí)行或以固定周期運(yùn)行的任務(wù),ScheduledExecuter可并發(fā)的完成定時(shí)任務(wù),而Quartz可根據(jù)調(diào)度策略執(zhí)行復(fù)雜的調(diào)度需求[1]。

1 使用JDK Timer調(diào)度任務(wù)

1.1 JDK Timer的原理

實(shí)現(xiàn)Timer的核心是Tasklist和TaskThread,Timer將接收到的任務(wù)存放在TimerList中,TimerList按照Task的最初執(zhí)行時(shí)間進(jìn)行排序。TimerThread在創(chuàng)建Timer時(shí)會(huì)啟動(dòng)成為一個(gè)守護(hù)線程。這個(gè)線程會(huì)輪詢(xún)所有任務(wù),找到一個(gè)最近要執(zhí)行的任務(wù),然后休眠,當(dāng)?shù)竭_(dá)最近要執(zhí)行任務(wù)的開(kāi)始時(shí)間點(diǎn),TimerThread被喚醒并執(zhí)行該任務(wù),之后TimerThread循環(huán)更新最近一個(gè)要執(zhí)行的任務(wù),繼續(xù)休眠。

1.2 使用JDK Timer實(shí)現(xiàn)任務(wù)調(diào)度

創(chuàng)建一個(gè)TimerTask的繼承類(lèi),實(shí)現(xiàn)自身的run方法,然后將其交給Timer去執(zhí)行。

public class MyTask extends TimerTask{

Public void run(){…}}

Timer time=new Timer();

MyTask task=new MyTask();

time.schedule(task,0,2000)//每隔2 s執(zhí)行一次

Timer的優(yōu)點(diǎn)在于簡(jiǎn)單易用,但Timer對(duì)任務(wù)的調(diào)度基于絕對(duì)時(shí)間且是單線程執(zhí)行,因此同一時(shí)刻只能執(zhí)行一個(gè)任務(wù)。由于JDK Timer線程并不捕獲異常,所以當(dāng)TimerTask拋出未檢查的異常,就會(huì)終止timer線程,已被安排尚未執(zhí)行的任務(wù)和新的任務(wù)均無(wú)法繼續(xù)執(zhí)行下去。

2 實(shí)現(xiàn)類(lèi)調(diào)度任務(wù)

2.1 ScheduledExecuter接口的原理

鑒于Timer的上述缺點(diǎn),ScheduledExecuter是基于線程池實(shí)現(xiàn)的,每一個(gè)被調(diào)度的任務(wù)均會(huì)由線程池中一個(gè)線程去執(zhí)行,任務(wù)是并發(fā)進(jìn)行,相互之間不會(huì)受到干擾。

ScheduledExecuter的設(shè)計(jì)思想是提供一個(gè)統(tǒng)一的任務(wù)執(zhí)行接口,通過(guò)execute方法可將任務(wù)放到調(diào)度隊(duì)列中。ScheduledExecuter在任務(wù)來(lái)臨前處于輪詢(xún)?nèi)蝿?wù)狀態(tài),只有當(dāng)任務(wù)被執(zhí)行時(shí),才會(huì)啟動(dòng)一個(gè)線程。

ScheduledExecuter整體結(jié)構(gòu)如圖1所示。

圖1 ScheduledExecuter整體結(jié)構(gòu)圖

Exector接口定義了用于接受用戶提交任務(wù)的execute方法。ExectorService繼承Exector接口,用于定義線程的生命周期,包括線程的運(yùn)行、關(guān)閉和終止?fàn)顟B(tài)。ScheduledExectorService在ExectorService基礎(chǔ)上提供了按時(shí)間安排執(zhí)行任務(wù)的功能并能延時(shí)一段時(shí)間觸發(fā)。ThreadPoolExecutor提供線程池的核心實(shí)現(xiàn),支持定時(shí)和周期性執(zhí)行任務(wù)。文中可根據(jù)不同的需求來(lái)使用不同的接口。

由于spring對(duì)ThreadPoolExecutor提供了較好的支持,在企業(yè)應(yīng)用中,一般使用spring提供的SchedulingTaskExector子接口來(lái)實(shí)現(xiàn)任務(wù)調(diào)度。該接口實(shí)現(xiàn)了SimpleSyncTaskExecutor、TimerTaskExecutor、Thread-PoolTaskExecutor等類(lèi)[2-3]。使用時(shí)可通過(guò)配置注入的方式實(shí)現(xiàn)。

2.2 使用ScheduledExecuter實(shí)現(xiàn)任務(wù)調(diào)度

以下任務(wù)1 s后開(kāi)始執(zhí)行,每隔1 s執(zhí)行任務(wù)1,從第2 s開(kāi)始,每隔1 s執(zhí)行任務(wù)2,從第3 s開(kāi)始,每隔1 s執(zhí)行任務(wù)3,從第4 s開(kāi)始,每隔1 s執(zhí)行任務(wù)4。

由執(zhí)行結(jié)果來(lái)看,1 s后輸出job1,2 s后同時(shí)輸出job1,job2,3 s后同時(shí)輸出job1,job2,job3,4 s后同時(shí)輸出job1,job2,job3,job4。結(jié)果分析如圖2所示。

圖2 ScheduledExecuter結(jié)果分析圖

Timer可實(shí)現(xiàn)簡(jiǎn)單的單線程定時(shí)任務(wù),ScheduledExecutor可線程池的方式并發(fā)的執(zhí)行任務(wù)調(diào)度,來(lái)彌補(bǔ)timer的不足,然而當(dāng)遇到更復(fù)雜的任務(wù),這種任務(wù)需要結(jié)構(gòu)時(shí)間工具類(lèi),ScheduledExecutor就無(wú)法滿足需求。而Quartz將定時(shí)程序做了較好的封裝,來(lái)方便企業(yè)實(shí)現(xiàn)定時(shí)任務(wù)的調(diào)度需求。

3 使用Quartz調(diào)度器調(diào)度任務(wù)

3.1 Quartz調(diào)度器的原理

Quartz是個(gè)開(kāi)源的作業(yè)調(diào)度框架,為在Java應(yīng)用程序中進(jìn)行作業(yè)調(diào)度提供了簡(jiǎn)單卻強(qiáng)大的機(jī)制[4-5]。其實(shí)現(xiàn)了作業(yè)和觸發(fā)器的多對(duì)多關(guān)系,還能將多個(gè)作業(yè)與不同的觸發(fā)器關(guān)聯(lián)。整合了Quartz的應(yīng)用程序,可重用來(lái)自不同事件的任務(wù),還可為一個(gè)事件組合多個(gè)任務(wù)[6]。

Quartz任務(wù)調(diào)度的核心元素是Scheduler,Trigger觸發(fā)器和Job作業(yè)[7],其中trigger和job是任務(wù)調(diào)度的元數(shù)據(jù),scheduler是實(shí)際執(zhí)行調(diào)度的控制器。關(guān)系如圖3所示。

圖3 Quartz核心元素關(guān)系圖

(1)trigger,用于定義調(diào)度時(shí)間的元素,即按照時(shí)間規(guī)則去執(zhí)行任務(wù)。Quartz中主要提供了4種類(lèi)型的trigger:SimpleTrigger、CronTirgger、DateIntervalTrigger和thIncludedDayTrigger。

(2)jobDetail,表示被調(diào)度的任務(wù)內(nèi)容。這個(gè)接口只有一個(gè)方法exector().job和trigger如上圖所示為一對(duì)多的關(guān)系。

(3)Scheduler是一個(gè)計(jì)劃調(diào)度器容器(總部),容器內(nèi)可容納較多的JobDetail和Trigger,當(dāng)容器啟動(dòng)后,里面的每個(gè)JobDetail均會(huì)根據(jù)trigger按部就班自動(dòng)去執(zhí)行。調(diào)度線程主要有兩個(gè),常規(guī)調(diào)度的線程和misfired trigger的線程。常規(guī)調(diào)度線程從任務(wù)執(zhí)行線程池獲取一個(gè)空閑線程,執(zhí)行與該trigger關(guān)聯(lián)的任務(wù)。Misfire線程是掃描所有的trigger,若有misfired trigger,則根據(jù)misfire的策略分別處理。scheduler是個(gè)容器,容器中有一個(gè)線程池,用來(lái)并行調(diào)度執(zhí)行每個(gè)作業(yè)。

當(dāng)任務(wù)調(diào)度執(zhí)行時(shí),Scheduler初始化啟動(dòng),配置QuartzSchedulerThread,然后取出JobStore里要觸發(fā)的Trigger,進(jìn)入線程等待狀態(tài),直到其出發(fā)點(diǎn)來(lái)臨[8]。之后執(zhí)行trigger對(duì)應(yīng)的JobDetail。任務(wù)調(diào)度執(zhí)行完成。Scheduler初始化、start和trigger執(zhí)行的時(shí)序圖4所示。

圖4 Quartz時(shí)序圖

3.2 使用Quartz實(shí)現(xiàn)任務(wù)調(diào)度

在企業(yè)級(jí)任務(wù)調(diào)度中,Quartz通常與Spring整合來(lái)實(shí)現(xiàn)定時(shí)任務(wù)的調(diào)度。例如,在某單位會(huì)議管理系統(tǒng)中,需定時(shí)發(fā)送郵件,該功能為會(huì)議創(chuàng)建人創(chuàng)建會(huì)議后系統(tǒng)會(huì)在會(huì)議舉行前半小時(shí)郵件告知與會(huì)人員參加會(huì)議[9-10]。具體實(shí)現(xiàn)如下:

4 結(jié)束語(yǔ)

本文介紹了3種常用的對(duì)任務(wù)進(jìn)行調(diào)度的Java實(shí)現(xiàn)方法,即JDKTimer,ScheduledExecutor接口的實(shí)現(xiàn)類(lèi),Quartz調(diào)度器。對(duì)于簡(jiǎn)單的基于起始時(shí)間點(diǎn)與時(shí)間間隔的任務(wù)調(diào)度,可使用JDK Timer;若需要同時(shí)調(diào)度多個(gè)任務(wù),基于線程池的ScheduledExecuter是更為合適的選擇;當(dāng)任務(wù)調(diào)度的策略復(fù)雜到難以憑借起始時(shí)間點(diǎn)與時(shí)間間隔來(lái)描述時(shí),Quartz調(diào)度器則體現(xiàn)出其的優(yōu)勢(shì)。在實(shí)際企業(yè)任務(wù)調(diào)度中,根據(jù)實(shí)際情況選擇,以便更好、更快的提高任務(wù)調(diào)度速度與效率。

[1] 胡利強(qiáng),周冬初,王偉.Quartz調(diào)度器與Web程序整合的研究和應(yīng)用[J].計(jì)算機(jī)與現(xiàn)化,2010(8):98-99.

[2] 丁振凡,李馨梅.Spring的任務(wù)調(diào)度方法研究[J].智能計(jì)算機(jī)與應(yīng)用,2012(8):54-60.

[3]CraigWalls.Spring in action[M].2版.畢慶紅,譯.北京:人民郵電出版社,2008.

[4] 劉博仁.利用Quartz框架實(shí)現(xiàn)作業(yè)調(diào)度的解決方案[J].計(jì)算機(jī)光盤(pán)軟件與應(yīng)用,2010(9):160-161.

[5]Bruce Eckel.Thinking in Java[M].北京:機(jī)械工業(yè)出版社,2007.

[6] 結(jié)城浩.Java多線程設(shè)計(jì)模式[M].北京:中國(guó)鐵道出版社,2005.

[7] 王崟,董志勇.基于Quartz的網(wǎng)管系統(tǒng)任務(wù)調(diào)度的實(shí)現(xiàn)[J].電腦開(kāi)發(fā)與應(yīng)用,2011(24):23-25.

[8] 朱哲明.基于Quartz的消息平臺(tái)的研究[D].北京:北京郵電大學(xué),2013.

[9] 陳雄華,林開(kāi)熊.Spring3.x企業(yè)應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)[M].北京:電子工業(yè)出版社,2012.

[10]Craig Walls,Ryan Breidenbach.Thinking in spring[M].2版.畢慶紅,譯.北京:人民郵電出版社,2008.

猜你喜歡
任務(wù)調(diào)度線程容器
容器倒置后壓力壓強(qiáng)如何變
基于C#線程實(shí)驗(yàn)探究
基于國(guó)產(chǎn)化環(huán)境的線程池模型研究與實(shí)現(xiàn)
難以置信的事情
基于改進(jìn)NSGA-Ⅱ算法的協(xié)同制造任務(wù)調(diào)度研究
淺談linux多線程協(xié)作
基于小生境遺傳算法的相控陣?yán)走_(dá)任務(wù)調(diào)度
云計(jì)算環(huán)境中任務(wù)調(diào)度策略
云計(jì)算中基于進(jìn)化算法的任務(wù)調(diào)度策略
取米