資料介紹
在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。
當客戶端訪問服務器時,有耗時操作的任務,則把該任務放入數據庫中。服務器每隔一段時間輪詢存放待處理任務的表,若表中有任務,則任務調度線程池采用多線程機制來執行該任務。任務執行成功后,刪除待處理任務表中的該任務信息,否則把該任務信息更新到任務失敗表,進行人工干預。
3.1 任務數據表
建兩張表,一張task表,用來存放待處理的任務;一張task_fail表用來存放失敗的任務。兩張表的結構一樣,結構如表1所示。
task表主要用來保存所有待處理的任務,每條任務信息屬于一種任務類型,由task_handle字段標識,任務類型值為該類型任務的具體實現類名。task_params 字段提供了執行該任務需要的所有參數,為字符串,需要在具體任務實現類中解析。handle_time字段提供了任務待執行的日期。
為盡量減少耗時操作對執行的影響,本文提出了異步任務的處理,使用多線程來管理耗時任務,作為后臺進程執行;同時把任務信息都持久化在數據庫中,保證了異步任務處理的靈活性、可靠性。
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。
當客戶端訪問服務器時,有耗時操作的任務,則把該任務放入數據庫中。服務器每隔一段時間輪詢存放待處理任務的表,若表中有任務,則任務調度線程池采用多線程機制來執行該任務。任務執行成功后,刪除待處理任務表中的該任務信息,否則把該任務信息更新到任務失敗表,進行人工干預。
3.1 任務數據表
建兩張表,一張task表,用來存放待處理的任務;一張task_fail表用來存放失敗的任務。兩張表的結構一樣,結構如表1所示。
task表主要用來保存所有待處理的任務,每條任務信息屬于一種任務類型,由task_handle字段標識,任務類型值為該類型任務的具體實現類名。task_params 字段提供了執行該任務需要的所有參數,為字符串,需要在具體任務實現類中解析。handle_time字段提供了任務待執行的日期。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 智能電網的彈性調控平臺任務調度研究 5次下載
- FPGA在視頻處理中的應用綜述 18次下載
- 視覺問答與對話任務研究綜述 10次下載
- 基于冗余任務消減的計算任務緩存系統 3次下載
- 復雜網絡建模中的優先連接機制相關研究 11次下載
- WEB的技術綜合應用和設計研究資料實驗說明 13次下載
- 如何使用Web在Java上進行并行計算的資料說明 6次下載
- Web網絡大數據分類系統 3次下載
- 嵌入式多核處理器任務調度研究 1次下載
- 基于android采用異步處理方式開發移動護理程序的設計 0次下載
- 基于TCBSA_ACO算法在云計算任務分配中的研究 0次下載
- 異步處理器設計中的關鍵技術研究 0次下載
- 面向RFID的復雜事件描述語言研究及應用
- 基于Web Service 的GIS在農業中的應用
- 基于危險理論的web文本挖掘研究
- 異步電動機的常見故障及處理方法 445次閱讀
- 同步級聯和異步級聯的區別 異步級聯和同步級聯分別要注意什么 1272次閱讀
- 如何利用OpenVINO加速LangChain中LLM任務 674次閱讀
- FreeRTOS中的任務管理 758次閱讀
- Spring Boot如何實現異步任務 1088次閱讀
- LLM在各種情感分析任務中的表現如何 2011次閱讀
- Flutter異步編程指南 487次閱讀
- Java多線程永動任務 多線程異步任務項目解讀 981次閱讀
- DeferredResult異步請求處理 提高系統吞吐量的一把利器 1074次閱讀
- 如何用Worker pool解決異步任務的問題 1495次閱讀
- 干貨:基于Redis配置Celery任務(附源碼) 2195次閱讀
- Python異步IO分析 1472次閱讀
- 關于一種面向異步FIFO的低開銷容錯機制研究 3057次閱讀
- FPGA設計中的異步復位同步釋放問題 2090次閱讀
- RNN在自然語言處理中的應用 5635次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發板設計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多