999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Web應用異步任務處理的實現研究

2012-08-20 05:18:46張文梅廖福保
網絡安全與數據管理 2012年4期

張文梅,廖福保

(廣東農工商職業技術學院 機電系,廣東 廣州 510507)

在Web應用中,某些功能的實現邏輯很復雜、執行比較耗時[1],例如涉及外部系統調用、多數據源等;此時,希望可以讓這些復雜的業務邏輯放在后臺執行,而前臺與用戶的交互可以不用等待,從而提高用戶體驗;或者需要以一定時間間隔重復運行任務、或在每天的指定時間運行任務的情況。為此,需要控制大型任務對服務器資源的消耗,降低Web服務器的并發連接數目,這就需要將大型任務的提交和執行分開,使服務器接受任務后立即斷開與客戶端的連接,減少服務器的并發連接數,而任務則推遲到服務器資源許可時執行,以抑制服務器資源的峰值消耗。

為盡量減少耗時操作對執行的影響,本文提出了異步任務的處理,使用多線程來管理耗時任務,作為后臺進程執行;同時把任務信息都持久化在數據庫中,保證了異步任務處理的靈活性、可靠性。

1 多線程

1.1 線程池

一個線程是程序中的一條執行流,是操作系統分配處理器的基本單位。并發是程序中多條執行流的同時推進,多任務并發對應多線程并發[2]。

但是為每個任務創建一個線程,當任務完成時撤消對應的線程存在明顯的缺陷。線程的創建需要一定的時間,給任務請求的響應帶來延遲,線程的創建和撤消也給操作系統帶來額外的管理負擔,若頻繁 “創建和撤消”,則將明顯增加系統的額外開銷。為有效降低線程重復創建和撤銷方面的開支可以采用線程池技術。

線程池技術提供了一種較好的解決方案[3]:系統維護由若干個線程組成的線程池。當有任務請求到達時,由池中的一個線程為之運行,在任務完成后不是將該線程撤消而是將其歸還線程池,使之能夠為后續到達的任務服務;若線程池中沒有空閑的線程,則任務進入等待狀態直到有空閑的線程。

1.2 Java中的線程池實現機制

Java在語言級實現了功能豐富的多線程編程機制[4],對線程池的建立和維護提供了強大的支持。特別在JDK1.5及以后的版本中,任務執行抽象的首選不再是Thread,而是Executor。Executor雖是一個簡單的接口,但它提供了異步任務執行框架并支持多種不同類型的任務執行策略,ExecutorService接口和ScheduledExecutorService接口對Executor進行了擴展,添加了管理線程執行和調度線程池的若干方法。通過Executors工具類提供的靜態工廠方法可以創建符合特定需求的基于線程池執行框架。

newChachedThreadPool()方法用于創建可緩存線程池的執行框架。當新的請求任務到達時,執行框架將盡可能地重用池中的空閑線程,若此時池中沒有空閑線程,則添加新線程,這個方法對池的大小沒有限制。另一方面,該執行框架能夠自動回收空閑時間超過60 s的線程,以合理使用系統資源。對于執行大量短異步任務的程序而言,這種方式的線程池通常可提高性能。

newFixedThreadPool(int nThreads)方法建立的執行框架中的線程池具有固定數量的線程。每提交一個任務它就創建一個線程,直到達到池的限定值nThreads,線程池的長度不再變化,新到達的任務在一個遵循先來先服務(FIFS)規則的無界隊列中等待執行。

newScheduledThreadPool(int nThreads)方法建立的執行框架中的線程池也是定長的,它支持定時的以及周期性的任務的執行。

這些工廠方法返回的Executor都是ThreadPoolExecutor()類的常用實例,能滿足大部分線程池的應用需求。

2 設計思路

為保證異步任務處理的靈活性和可靠性,本文設計的思路為:任務持久化+Java線程池+任務調度。

2.1 任務持久化

將待處理的任務信息保存在可信任的數據庫中,同時要確保當任務處理服務器出問題后這些未執行成功、或未開始執行的任務不會被丟失。

2.2 任務調度

當任務信息都持久化在數據庫中之后,需要將這些信息讀取出來執行具體的業務邏輯操作,本文通過ScheduledExecutorService來實現對任務的循環調度,例如可采取每隔2 min掃描一次待處理任務列表,若有記錄則提取出來執行。

3 具體實現

異步任務處理中各組成部分在運行過程中的調用關系如圖1。

圖1 異步任務處理中的調用關系

當客戶端訪問服務器時,有耗時操作的任務,則把該任務放入數據庫中。服務器每隔一段時間輪詢存放待處理任務的表,若表中有任務,則任務調度線程池采用多線程機制來執行該任務。任務執行成功后,刪除待處理任務表中的該任務信息,否則把該任務信息更新到任務失敗表,進行人工干預。

3.1 任務數據表

建兩張表,一張task表,用來存放待處理的任務;一張task_fail表用來存放失敗的任務。兩張表的結構一樣,結構如表1所示。

表1 task和task_fail數據表結構

task表主要用來保存所有待處理的任務,每條任務信息屬于一種任務類型,由task_handle字段標識,任務類型值為該類型任務的具體實現類名。task_params字段提供了執行該任務需要的所有參數,為字符串,需要在具體任務實現類中解析。handle_time字段提供了任務待執行的日期。

每條任務被執行之后根據執行情況進行刪除或者更新操作,任務成功執行,就從task表中刪除該記錄。Task_fail表主要用來保存執行失敗、需要人工干預的任務記錄,記錄來源于task表。

3.2 任務處理過程

任務處理的過程如圖2所示。

(1)當服務器啟動后,根據調度策略每隔一段時間調度一次,而不管上次調度是否已經執行完畢;任務輪詢主線程查詢task表,從中取出一定條的數據。

(2)對從task表中查詢出來的每條記錄,將該條記錄的ID放進本地cache中,根據記錄中task_handle和task_params字段的值獲得處理該任務對應的類及參數值,在異步線程池中利用反射機制來執行任務。

(3)具體處理類對該任務處理完成之后返回結果,系統對tasks表中該條記錄進行刪除,同時將cache中的記錄ID清除、避免cache無限膨脹。若任務處理失敗,系統就把該條記錄插入到task_fail表中,以備人工干預。

(4)當到達下次執行時間時,再次掃描tasks表,循環上面的邏輯。不過這次在任務處理之前,要先在本地cache中查詢是否該條記錄正在被處理,若cache中已經存在該條記錄就無需處理了,以避免一些任務被重復并發執行。

3.3 任務輪詢主線程的實現

Executor的靜態方法生成一個固定的線程池。線程池的線程是不會釋放的,即使它空閑,這就會產生性能問題,如果線程池的大小為200,當全部使用完畢后,所有的線程會繼續留在池中,相應的內存和線程切換都會增加。如果要避免這個問題,就必須直接使用Thread-PoolExecutor()來構造,設置“最大線程數”、“最小線程數”和“空閑線程存活的時間”。

為了線程池能按時間計劃來執行任務,允許用戶設定計劃執行任務的時間,就要使用newScheduledThread-Pool(int nThreads)方法返回 ThreadPoolExecutor類的實例。參數nThreads是設定線程池中線程的最小數目,當任務較多時,線程池會自動創建更多的工作線程來執行任務。其關鍵代碼如下:

3.4 執行任務線程池的實現

執行任務的線程池采用newFixedThreadPool(int nThreads)方法建立,線程池具有固定數量。關鍵代碼如下:

對于任務的生產者,只需要向Task表中insert記錄即可,操作簡單。待執行任務信息在可靠數據庫中保存,即使任務處理出了問題也不會讓未處理的任務信息丟失。

本文利用Executor接口提供的異步任務執行框架和任務執行策略,實現多任務的執行。在為具體應用線程池時往往需要根據應用的需求和處理任務的特點來優化線程池的使用,設置合適的 “最大線程數”、“最小線程數”和“空閑線程存活的時間”,采用不同的策略調整線程池的工作線程數,才能達到最好的效果。

[1]于國良.建立高性能擴展的Web應用系統[J].微計算機信息,2006,18(04):63-64.

[2]鄭扣根.操作系統概論[M].北京:高等教育出版社,2004.

[3]王華,馬亮,顧明.線程池技術研究與應用[J].計算機應用研究,2005(11):141-145.

[4]Sun Microsystems Inc.Java Platform,Standard Edition 6 API Specification[EB/OL].(2011-12-20).http://java.sun.com/javase/6/docs/api/index.Html,2008.

主站蜘蛛池模板: 成人精品免费视频| 小13箩利洗澡无码视频免费网站| 在线观看无码a∨| 精品亚洲麻豆1区2区3区 | 亚洲人成电影在线播放| 成人福利在线视频| 无码 在线 在线| 人妻中文字幕无码久久一区| 免费看av在线网站网址| 美女无遮挡被啪啪到高潮免费| 久草青青在线视频| 亚洲第一页在线观看| 亚洲国产精品无码久久一线| 国内熟女少妇一线天| 国产白浆视频| 国产精品 欧美激情 在线播放 | 国产又色又刺激高潮免费看| 亚洲国产AV无码综合原创| 日本91视频| 国产成人h在线观看网站站| 亚洲综合精品第一页| 久久频这里精品99香蕉久网址| 日本三级精品| 2024av在线无码中文最新| 国产欧美网站| 一级成人a毛片免费播放| 亚洲无线观看| 欧美97色| AV片亚洲国产男人的天堂| 98超碰在线观看| a亚洲视频| 综合亚洲网| 欧美精品亚洲精品日韩专| 欧美啪啪一区| 亚洲av日韩综合一区尤物| 香蕉久久国产超碰青草| 国产激情第一页| 亚洲成人免费看| 久久伊伊香蕉综合精品| 久久国产免费观看| 亚洲av无码久久无遮挡| 国产人成在线视频| 久久精品午夜视频| 一本色道久久88亚洲综合| 激情六月丁香婷婷| 亚洲欧美不卡中文字幕| 亚洲日韩高清在线亚洲专区| 国产精品无码一区二区桃花视频| 白浆免费视频国产精品视频| 国产成人区在线观看视频| 亚洲日本中文字幕天堂网| 亚洲免费人成影院| 再看日本中文字幕在线观看| 国产流白浆视频| 国产成人在线无码免费视频| 久久黄色免费电影| 成人va亚洲va欧美天堂| 精品精品国产高清A毛片| 999国产精品永久免费视频精品久久| 国产精品无码久久久久AV| 日本免费精品| 婷婷开心中文字幕| 91美女在线| 亚洲成a人片| 亚洲精品大秀视频| 日韩第九页| 亚洲精品国偷自产在线91正片| 国产1区2区在线观看| 激情综合五月网| 国产哺乳奶水91在线播放| 日韩精品无码不卡无码| 欧美成人日韩| 国产欧美日韩免费| 午夜a视频| 国产精品福利导航| 欧美专区日韩专区| 另类专区亚洲| 欧美高清视频一区二区三区| 欧美日韩成人在线观看| 另类专区亚洲| 美女黄网十八禁免费看| 久热精品免费|