• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

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

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

      王 秀,孫忠林,姜 莉

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

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

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

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

      1.1 JDK Timer的原理

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

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

      創(chuàng)建一個TimerTask的繼承類,實現(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)點在于簡單易用,但Timer對任務(wù)的調(diào)度基于絕對時間且是單線程執(zhí)行,因此同一時刻只能執(zhí)行一個任務(wù)。由于JDK Timer線程并不捕獲異常,所以當TimerTask拋出未檢查的異常,就會終止timer線程,已被安排尚未執(zhí)行的任務(wù)和新的任務(wù)均無法繼續(xù)執(zhí)行下去。

      2 實現(xiàn)類調(diào)度任務(wù)

      2.1 ScheduledExecuter接口的原理

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      圖4 Quartz時序圖

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

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

      4 結(jié)束語

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

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

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

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

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

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

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

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

      [8] 朱哲明.基于Quartz的消息平臺的研究[D].北京:北京郵電大學,2013.

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

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

      猜你喜歡
      任務(wù)調(diào)度線程容器
      Different Containers不同的容器
      難以置信的事情
      基于改進NSGA-Ⅱ算法的協(xié)同制造任務(wù)調(diào)度研究
      基于時間負載均衡蟻群算法的云任務(wù)調(diào)度優(yōu)化
      淺談linux多線程協(xié)作
      云計算環(huán)境中任務(wù)調(diào)度策略
      云計算中基于進化算法的任務(wù)調(diào)度策略
      取米
      Linux線程實現(xiàn)技術(shù)研究
      么移動中間件線程池并發(fā)機制優(yōu)化改進
      莆田市| 工布江达县| 连江县| 南雄市| 黔东| 通榆县| 双峰县| 专栏| 涡阳县| 濮阳市| 万宁市| 霸州市| 荆州市| 朔州市| 祁阳县| 封开县| 青海省| 兴隆县| 荣成市| 黑水县| 棋牌| 灵丘县| 化德县| 尚志市| 钟祥市| 建始县| 汶川县| 舒城县| 贵德县| 台东市| 柞水县| 新巴尔虎右旗| 泰兴市| 伊春市| 乌鲁木齐市| 临沧市| 大名县| 彝良县| 寿宁县| 手机| 佛坪县|