資料介紹
在Web應(yīng)用中,某些功能的實(shí)現(xiàn)邏輯很復(fù)雜、執(zhí)行比較耗時(shí)[1],例如涉及外部系統(tǒng)調(diào)用、多數(shù)據(jù)源等;此時(shí),希望可以讓這些復(fù)雜的業(yè)務(wù)邏輯放在后臺(tái)執(zhí)行,而前臺(tái)與用戶的交互可以不用等待,從而提高用戶體驗(yàn);或者需要以一定時(shí)間間隔重復(fù)運(yùn)行任務(wù)、或在每天的指定時(shí)間運(yùn)行任務(wù)的情況。為此,需要控制大型任務(wù)對服務(wù)器資源的消耗,降低Web服務(wù)器的并發(fā)連接數(shù)目,這就需要將大型任務(wù)的提交和執(zhí)行分開,使服務(wù)器接受任務(wù)后立即斷開與客戶端的連接,減少服務(wù)器的并發(fā)連接數(shù),而任務(wù)則推遲到服務(wù)器資源許可時(shí)執(zhí)行,以抑制服務(wù)器資源的峰值消耗。
為盡量減少耗時(shí)操作對執(zhí)行的影響,本文提出了異步任務(wù)的處理,使用多線程來管理耗時(shí)任務(wù),作為后臺(tái)進(jìn)程執(zhí)行;同時(shí)把任務(wù)信息都持久化在數(shù)據(jù)庫中,保證了異步任務(wù)處理的靈活性、可靠性。
1 多線程
1.1線程池
一個(gè)線程是程序中的一條執(zhí)行流,是操作系統(tǒng)分配處理器的基本單位。并發(fā)是程序中多條執(zhí)行流的同時(shí)推進(jìn),多任務(wù)并發(fā)對應(yīng)多線程并發(fā)[2]。
但是為每個(gè)任務(wù)創(chuàng)建一個(gè)線程,當(dāng)任務(wù)完成時(shí)撤消對應(yīng)的線程存在明顯的缺陷。線程的創(chuàng)建需要一定的時(shí)間,給任務(wù)請求的響應(yīng)帶來延遲,線程的創(chuàng)建和撤消也給操作系統(tǒng)帶來額外的管理負(fù)擔(dān),若頻繁“創(chuàng)建和撤消”,則將明顯增加系統(tǒng)的額外開銷。為有效降低線程重復(fù)創(chuàng)建和撤銷方面的開支可以采用線程池技術(shù)。
線程池技術(shù)提供了一種較好的解決方案[3]:系統(tǒng)維護(hù)由若干個(gè)線程組成的線程池。當(dāng)有任務(wù)請求到達(dá)時(shí),由池中的一個(gè)線程為之運(yùn)行,在任務(wù)完成后不是將該線程撤消而是將其歸還線程池,使之能夠?yàn)楹罄m(xù)到達(dá)的任務(wù)服務(wù);若線程池中沒有空閑的線程,則任務(wù)進(jìn)入等待狀態(tài)直到有空閑的線程。
1.2 Java中的線程池實(shí)現(xiàn)機(jī)制
Java在語言級實(shí)現(xiàn)了功能豐富的多線程編程機(jī)制[4],對線程池的建立和維護(hù)提供了強(qiáng)大的支持。特別在JDK1.5及以后的版本中,任務(wù)執(zhí)行抽象的首選不再是Thread,而是Executor。Executor雖是一個(gè)簡單的接口,但它提供了異步任務(wù)執(zhí)行框架并支持多種不同類型的任務(wù)執(zhí)行策略,ExecutorService接口和ScheduledExecutorService接口對Executor進(jìn)行了擴(kuò)展,添加了管理線程執(zhí)行和調(diào)度線程池的若干方法。通過Executors工具類提供的靜態(tài)工廠方法可以創(chuàng)建符合特定需求的基于線程池執(zhí)行框架。
newChachedThreadPool()方法用于創(chuàng)建可緩存線程池的執(zhí)行框架。當(dāng)新的請求任務(wù)到達(dá)時(shí),執(zhí)行框架將盡可能地重用池中的空閑線程,若此時(shí)池中沒有空閑線程,則添加新線程,這個(gè)方法對池的大小沒有限制。另一方面,該執(zhí)行框架能夠自動(dòng)回收空閑時(shí)間超過60 s的線程,以合理使用系統(tǒng)資源。對于執(zhí)行大量短異步任務(wù)的程序而言,這種方式的線程池通常可提高性能。
newFixedThreadPool(int nThreads)方法建立的執(zhí)行框架中的線程池具有固定數(shù)量的線程。每提交一個(gè)任務(wù)它就創(chuàng)建一個(gè)線程,直到達(dá)到池的限定值nThreads,線程池的長度不再變化,新到達(dá)的任務(wù)在一個(gè)遵循先來先服務(wù)(FIFS)規(guī)則的無界隊(duì)列中等待執(zhí)行。
newScheduledThreadPool(int nThreads)方法建立的執(zhí)行框架中的線程池也是定長的,它支持定時(shí)的以及周期性的任務(wù)的執(zhí)行。
這些工廠方法返回的Executor 都是ThreadPoolExecutor()類的常用實(shí)例,能滿足大部分線程池的應(yīng)用需求。
2 設(shè)計(jì)思路
為保證異步任務(wù)處理的靈活性和可靠性,本文設(shè)計(jì)的思路為:任務(wù)持久化+Java線程池+任務(wù)調(diào)度。
2.1 任務(wù)持久化
將待處理的任務(wù)信息保存在可信任的數(shù)據(jù)庫中,同時(shí)要確保當(dāng)任務(wù)處理服務(wù)器出問題后這些未執(zhí)行成功、或未開始執(zhí)行的任務(wù)不會(huì)被丟失。
2.2 任務(wù)調(diào)度
當(dāng)任務(wù)信息都持久化在數(shù)據(jù)庫中之后,需要將這些信息讀取出來執(zhí)行具體的業(yè)務(wù)邏輯操作,本文通過ScheduledExecutorService來實(shí)現(xiàn)對任務(wù)的循環(huán)調(diào)度,例如可采取每隔2 min掃描一次待處理任務(wù)列表,若有記錄則提取出來執(zhí)行。
3 具體實(shí)現(xiàn)
異步任務(wù)處理中各組成部分在運(yùn)行過程中的調(diào)用關(guān)系如圖1。
當(dāng)客戶端訪問服務(wù)器時(shí),有耗時(shí)操作的任務(wù),則把該任務(wù)放入數(shù)據(jù)庫中。服務(wù)器每隔一段時(shí)間輪詢存放待處理任務(wù)的表,若表中有任務(wù),則任務(wù)調(diào)度線程池采用多線程機(jī)制來執(zhí)行該任務(wù)。任務(wù)執(zhí)行成功后,刪除待處理任務(wù)表中的該任務(wù)信息,否則把該任務(wù)信息更新到任務(wù)失敗表,進(jìn)行人工干預(yù)。
3.1 任務(wù)數(shù)據(jù)表
建兩張表,一張task表,用來存放待處理的任務(wù);一張task_fail表用來存放失敗的任務(wù)。兩張表的結(jié)構(gòu)一樣,結(jié)構(gòu)如表1所示。
task表主要用來保存所有待處理的任務(wù),每條任務(wù)信息屬于一種任務(wù)類型,由task_handle字段標(biāo)識(shí),任務(wù)類型值為該類型任務(wù)的具體實(shí)現(xiàn)類名。task_params 字段提供了執(zhí)行該任務(wù)需要的所有參數(shù),為字符串,需要在具體任務(wù)實(shí)現(xiàn)類中解析。handle_time字段提供了任務(wù)待執(zhí)行的日期。
為盡量減少耗時(shí)操作對執(zhí)行的影響,本文提出了異步任務(wù)的處理,使用多線程來管理耗時(shí)任務(wù),作為后臺(tái)進(jìn)程執(zhí)行;同時(shí)把任務(wù)信息都持久化在數(shù)據(jù)庫中,保證了異步任務(wù)處理的靈活性、可靠性。
1 多線程
1.1線程池
一個(gè)線程是程序中的一條執(zhí)行流,是操作系統(tǒng)分配處理器的基本單位。并發(fā)是程序中多條執(zhí)行流的同時(shí)推進(jìn),多任務(wù)并發(fā)對應(yīng)多線程并發(fā)[2]。
但是為每個(gè)任務(wù)創(chuàng)建一個(gè)線程,當(dāng)任務(wù)完成時(shí)撤消對應(yīng)的線程存在明顯的缺陷。線程的創(chuàng)建需要一定的時(shí)間,給任務(wù)請求的響應(yīng)帶來延遲,線程的創(chuàng)建和撤消也給操作系統(tǒng)帶來額外的管理負(fù)擔(dān),若頻繁“創(chuàng)建和撤消”,則將明顯增加系統(tǒng)的額外開銷。為有效降低線程重復(fù)創(chuàng)建和撤銷方面的開支可以采用線程池技術(shù)。
線程池技術(shù)提供了一種較好的解決方案[3]:系統(tǒng)維護(hù)由若干個(gè)線程組成的線程池。當(dāng)有任務(wù)請求到達(dá)時(shí),由池中的一個(gè)線程為之運(yùn)行,在任務(wù)完成后不是將該線程撤消而是將其歸還線程池,使之能夠?yàn)楹罄m(xù)到達(dá)的任務(wù)服務(wù);若線程池中沒有空閑的線程,則任務(wù)進(jìn)入等待狀態(tài)直到有空閑的線程。
1.2 Java中的線程池實(shí)現(xiàn)機(jī)制
Java在語言級實(shí)現(xiàn)了功能豐富的多線程編程機(jī)制[4],對線程池的建立和維護(hù)提供了強(qiáng)大的支持。特別在JDK1.5及以后的版本中,任務(wù)執(zhí)行抽象的首選不再是Thread,而是Executor。Executor雖是一個(gè)簡單的接口,但它提供了異步任務(wù)執(zhí)行框架并支持多種不同類型的任務(wù)執(zhí)行策略,ExecutorService接口和ScheduledExecutorService接口對Executor進(jìn)行了擴(kuò)展,添加了管理線程執(zhí)行和調(diào)度線程池的若干方法。通過Executors工具類提供的靜態(tài)工廠方法可以創(chuàng)建符合特定需求的基于線程池執(zhí)行框架。
newChachedThreadPool()方法用于創(chuàng)建可緩存線程池的執(zhí)行框架。當(dāng)新的請求任務(wù)到達(dá)時(shí),執(zhí)行框架將盡可能地重用池中的空閑線程,若此時(shí)池中沒有空閑線程,則添加新線程,這個(gè)方法對池的大小沒有限制。另一方面,該執(zhí)行框架能夠自動(dòng)回收空閑時(shí)間超過60 s的線程,以合理使用系統(tǒng)資源。對于執(zhí)行大量短異步任務(wù)的程序而言,這種方式的線程池通常可提高性能。
newFixedThreadPool(int nThreads)方法建立的執(zhí)行框架中的線程池具有固定數(shù)量的線程。每提交一個(gè)任務(wù)它就創(chuàng)建一個(gè)線程,直到達(dá)到池的限定值nThreads,線程池的長度不再變化,新到達(dá)的任務(wù)在一個(gè)遵循先來先服務(wù)(FIFS)規(guī)則的無界隊(duì)列中等待執(zhí)行。
newScheduledThreadPool(int nThreads)方法建立的執(zhí)行框架中的線程池也是定長的,它支持定時(shí)的以及周期性的任務(wù)的執(zhí)行。
這些工廠方法返回的Executor 都是ThreadPoolExecutor()類的常用實(shí)例,能滿足大部分線程池的應(yīng)用需求。
2 設(shè)計(jì)思路
為保證異步任務(wù)處理的靈活性和可靠性,本文設(shè)計(jì)的思路為:任務(wù)持久化+Java線程池+任務(wù)調(diào)度。
2.1 任務(wù)持久化
將待處理的任務(wù)信息保存在可信任的數(shù)據(jù)庫中,同時(shí)要確保當(dāng)任務(wù)處理服務(wù)器出問題后這些未執(zhí)行成功、或未開始執(zhí)行的任務(wù)不會(huì)被丟失。
2.2 任務(wù)調(diào)度
當(dāng)任務(wù)信息都持久化在數(shù)據(jù)庫中之后,需要將這些信息讀取出來執(zhí)行具體的業(yè)務(wù)邏輯操作,本文通過ScheduledExecutorService來實(shí)現(xiàn)對任務(wù)的循環(huán)調(diào)度,例如可采取每隔2 min掃描一次待處理任務(wù)列表,若有記錄則提取出來執(zhí)行。
3 具體實(shí)現(xiàn)
異步任務(wù)處理中各組成部分在運(yùn)行過程中的調(diào)用關(guān)系如圖1。
當(dāng)客戶端訪問服務(wù)器時(shí),有耗時(shí)操作的任務(wù),則把該任務(wù)放入數(shù)據(jù)庫中。服務(wù)器每隔一段時(shí)間輪詢存放待處理任務(wù)的表,若表中有任務(wù),則任務(wù)調(diào)度線程池采用多線程機(jī)制來執(zhí)行該任務(wù)。任務(wù)執(zhí)行成功后,刪除待處理任務(wù)表中的該任務(wù)信息,否則把該任務(wù)信息更新到任務(wù)失敗表,進(jìn)行人工干預(yù)。
3.1 任務(wù)數(shù)據(jù)表
建兩張表,一張task表,用來存放待處理的任務(wù);一張task_fail表用來存放失敗的任務(wù)。兩張表的結(jié)構(gòu)一樣,結(jié)構(gòu)如表1所示。
task表主要用來保存所有待處理的任務(wù),每條任務(wù)信息屬于一種任務(wù)類型,由task_handle字段標(biāo)識(shí),任務(wù)類型值為該類型任務(wù)的具體實(shí)現(xiàn)類名。task_params 字段提供了執(zhí)行該任務(wù)需要的所有參數(shù),為字符串,需要在具體任務(wù)實(shí)現(xiàn)類中解析。handle_time字段提供了任務(wù)待執(zhí)行的日期。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 智能電網(wǎng)的彈性調(diào)控平臺(tái)任務(wù)調(diào)度研究 5次下載
- FPGA在視頻處理中的應(yīng)用綜述 18次下載
- 視覺問答與對話任務(wù)研究綜述 10次下載
- 基于冗余任務(wù)消減的計(jì)算任務(wù)緩存系統(tǒng) 3次下載
- 復(fù)雜網(wǎng)絡(luò)建模中的優(yōu)先連接機(jī)制相關(guān)研究 11次下載
- WEB的技術(shù)綜合應(yīng)用和設(shè)計(jì)研究資料實(shí)驗(yàn)說明 13次下載
- 如何使用Web在Java上進(jìn)行并行計(jì)算的資料說明 6次下載
- Web網(wǎng)絡(luò)大數(shù)據(jù)分類系統(tǒng) 3次下載
- 嵌入式多核處理器任務(wù)調(diào)度研究 1次下載
- 基于android采用異步處理方式開發(fā)移動(dòng)護(hù)理程序的設(shè)計(jì) 0次下載
- 基于TCBSA_ACO算法在云計(jì)算任務(wù)分配中的研究 0次下載
- 異步處理器設(shè)計(jì)中的關(guān)鍵技術(shù)研究 0次下載
- 面向RFID的復(fù)雜事件描述語言研究及應(yīng)用
- 基于Web Service 的GIS在農(nóng)業(yè)中的應(yīng)用
- 基于危險(xiǎn)理論的web文本挖掘研究
- 異步電動(dòng)機(jī)的常見故障及處理方法 445次閱讀
- 同步級聯(lián)和異步級聯(lián)的區(qū)別 異步級聯(lián)和同步級聯(lián)分別要注意什么 1272次閱讀
- 如何利用OpenVINO加速LangChain中LLM任務(wù) 674次閱讀
- FreeRTOS中的任務(wù)管理 758次閱讀
- Spring Boot如何實(shí)現(xiàn)異步任務(wù) 1088次閱讀
- LLM在各種情感分析任務(wù)中的表現(xiàn)如何 2011次閱讀
- Flutter異步編程指南 487次閱讀
- Java多線程永動(dòng)任務(wù) 多線程異步任務(wù)項(xiàng)目解讀 981次閱讀
- DeferredResult異步請求處理 提高系統(tǒng)吞吐量的一把利器 1074次閱讀
- 如何用Worker pool解決異步任務(wù)的問題 1495次閱讀
- 干貨:基于Redis配置Celery任務(wù)(附源碼) 2195次閱讀
- Python異步IO分析 1472次閱讀
- 關(guān)于一種面向異步FIFO的低開銷容錯(cuò)機(jī)制研究 3057次閱讀
- FPGA設(shè)計(jì)中的異步復(fù)位同步釋放問題 2090次閱讀
- RNN在自然語言處理中的應(yīng)用 5635次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費(fèi)
- 2開關(guān)電源基礎(chǔ)知識(shí)
- 5.73 MB | 6次下載 | 免費(fèi)
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計(jì)
- 0.60 MB | 3次下載 | 免費(fèi)
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 0.61 MB | 2次下載 | 免費(fèi)
- 6基于FPGA的C8051F單片機(jī)開發(fā)板設(shè)計(jì)
- 0.70 MB | 2次下載 | 免費(fèi)
- 751單片機(jī)窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費(fèi)
- 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21548次下載 | 免費(fèi)
- 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6653次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191185次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183278次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評論
查看更多