葛中澤,鄒 蕊
(鄂州大學(xué)計算機系,湖北鄂州 436000)
Web信息系統(tǒng)異步編程模式的探討
葛中澤,鄒 蕊
(鄂州大學(xué)計算機系,湖北鄂州 436000)
在Web信息系統(tǒng)的開發(fā)過程中,將Web多線程技術(shù)和Ajax技術(shù)有機結(jié)合起來,提出了一種異步編程模式,有效地解決同步編程模式會出現(xiàn)開銷大且費時的程序段阻塞當(dāng)前進程,以及在客戶端無法實時讀取服務(wù)器端進程狀態(tài)信息的問題.在開發(fā)“在線圖書管理信息系統(tǒng)”中多次使用了異步編程模式,并經(jīng)過一年的使用證明,該方法是可靠和行之有效的.
異步編程模式;同步編程模式;Ajax;多線程
Web信息系統(tǒng)同步編程模式是指客戶端向服務(wù)器發(fā)出請求后就一直等待服務(wù)器處理結(jié)果的一種編程方式.如果服務(wù)器處理任務(wù)復(fù)雜,費時較長,客戶端勢必長時間等待,且客服端無法知曉服務(wù)器處理該復(fù)雜任務(wù)的進度.
如在在線圖書管理信息系統(tǒng)的研發(fā)中,需要定期將用戶的借閱信息以郵件的形式發(fā)送到用戶的郵箱中.圖1是在線圖書管理信息系統(tǒng)的結(jié)構(gòu)圖,郵件的發(fā)送是由郵件服務(wù)器來實現(xiàn)的,如果企業(yè)的經(jīng)費充足,可以自己駕設(shè)內(nèi)部的郵件服務(wù)器,否則就利用互聯(lián)網(wǎng)上的公用郵件服務(wù)器[1].
圖1 在線圖書管理信息系統(tǒng)的架構(gòu)
當(dāng)管理員點擊郵件發(fā)送命令時,Web服務(wù)器以客戶端的形式向郵件服務(wù)器發(fā)送請求,郵件服務(wù)器收到請求后開始發(fā)送郵件.筆者在系統(tǒng)的研發(fā)中遇到郵件服務(wù)器在短時間內(nèi)發(fā)送大量的郵件時,就會出現(xiàn)錯誤而停發(fā)的問題.因此,只要每間隔3 s發(fā)送一封郵件,服務(wù)器就不會出現(xiàn)錯誤.郵件同步發(fā)送的過程如圖2所示.
圖2 大批量郵件同步發(fā)送的時序圖
郵件以同步方式發(fā)送存在2個問題:1)由于大批量郵件的發(fā)送需要很長時間(100封郵件大約需要6 min),使得Web服務(wù)器處于阻塞狀態(tài),不能執(zhí)行其他任務(wù);2)用戶無法了解郵件發(fā)送的進程,既不知道發(fā)送了多少郵件,也不知道還有多少郵件需要發(fā)送.為了解決同步方式發(fā)送存在的問題,采用異步編程的模式是最佳方式.
Web信息系統(tǒng)異步編程模式是指客戶端向Web服務(wù)器發(fā)送請求后,Web服務(wù)器以多線程的方式處理客戶的任務(wù),客戶不需要等待服務(wù)器的處理結(jié)果,而是通過異步通信方式向服務(wù)器查詢結(jié)果.其優(yōu)點是客戶端不用等待服務(wù)器的返回結(jié)果,且節(jié)約時間;客戶端可以通過向服務(wù)器輪詢得到處理任務(wù)的中間進程和數(shù)據(jù),掌握服務(wù)器處理進度.傳統(tǒng)的Ajax技術(shù)以異步方式與服務(wù)器通信,在客戶端進行異步更新,實現(xiàn)異步編程;如果需要采集服務(wù)器的中間過程數(shù)據(jù),還必須結(jié)合服務(wù)器的多線程技術(shù)及服務(wù)器的會話對象進行處理.Web信息系統(tǒng)異步編程包括Ajax技術(shù)和多線程技術(shù),這是兩者結(jié)合的一種應(yīng)用技術(shù).
多線程技術(shù)是實現(xiàn)需要并發(fā)執(zhí)行的應(yīng)用程序的較好選擇,尤其對于大部分時間被阻塞的程序段,例如在開發(fā)訪問網(wǎng)絡(luò)資源,系統(tǒng)開銷比較大的操作或?qū)崿F(xiàn)快速的用戶界面響應(yīng)時,具有不可替代的作用[2].
目前多數(shù)操作系統(tǒng)支持多任務(wù)調(diào)度和處理,多任務(wù)通常包括兩大類:多進程和多線程.多進程是指在系統(tǒng)中正在運行的多個應(yīng)用程序;多線程是系統(tǒng)分配處理器時間資源的基本單元,或者說線程是進程中的基本執(zhí)行單元.對操作系統(tǒng)而言,其調(diào)度單元是線程.一個進程至少包括一個線程,稱之為主線程.一個進程從主線程的執(zhí)行開始而創(chuàng)建一個或多個次線程,就是所謂基于多線程的多任務(wù)[3].
Ajax(Asynchronous Java Script and XML)的含意是異步JavaScript和XML.實際上Ajax是對現(xiàn)有技術(shù)(如JavaScript,XML,XHTML,CSS和XMLHTTP等)的一種組合.相對于傳統(tǒng)的Web應(yīng)用程序,Ajax有許多優(yōu)勢:異步通信模式、最少的數(shù)據(jù)傳送量、減少服務(wù)器的負(fù)載、用戶體驗的連貫性、頁面上下文的保持等等.Ajax使用現(xiàn)存的技術(shù)為客戶端提供了與Web服務(wù)器之間進行異步通信的方式,從而讓應(yīng)用程序可以擺脫傳統(tǒng)請求響應(yīng)模型的開發(fā)方式[4].
下面以在線圖書管理信息系統(tǒng)的大批量郵件發(fā)送為例,來探討Web信息系統(tǒng)中的異步編程模式.圖3是大批量郵件異步發(fā)送的時序圖.
圖3 大批量郵件異步發(fā)送的時序圖
圖3中1~5是主線程,a~g是發(fā)送郵件的輔助進程,6~9是客戶端異步無刷新查詢進程.輔助進程是由主線程創(chuàng)建的執(zhí)行長時間費時任務(wù)的一個進程;2個進程執(zhí)行各自的任務(wù),互不影響.查詢進程使用Ajax技術(shù),用來查詢輔助進程中的狀態(tài)信息,掌握輔助進程的進度.
3.1 編制業(yè)務(wù)類和封裝Web信息系統(tǒng)業(yè)務(wù) 在在線圖書管理信息系統(tǒng)中,郵件的發(fā)送是一個獨立的業(yè)務(wù),因此,把發(fā)送郵件編制成一個webmail類,用來封裝郵件數(shù)據(jù)和發(fā)送過程[5].webmail類屬性有:
1)state標(biāo)志郵件發(fā)送過程中的狀態(tài):0為沒有開始,1為正在運行,2為成功結(jié)束,3為失敗結(jié)束.
2)percent表示郵件發(fā)送的進度.
3)from郵件的源地址.發(fā)送郵件前,先需要到郵件站點上注冊免費郵箱,利用郵件提供商的smtp服務(wù)器發(fā)送郵件.
4)userName源郵箱的用戶名.即申請的免費郵箱的用戶名.
5)userPassword源郵箱的密碼.
6)smtpServer smtp服務(wù)器的地址.
7)classId學(xué)生班級的ID號.根據(jù)班級號在數(shù)據(jù)庫中可以查詢到學(xué)生的借閱信息和郵箱地址.
8)StartTime郵件發(fā)送開始時間.
9)endTime郵件發(fā)送結(jié)束時間.
10)ErrorTime郵件發(fā)送出錯時間.
webmail類的方法有:
send()發(fā)送批量學(xué)生借閱信息到學(xué)生郵箱.send()方法的執(zhí)行流程如圖4所示.
圖4 webMail類send()方法流程圖
3.2 Web信息系統(tǒng)多線程異步編程 圖3中第4步是在Web服務(wù)器中創(chuàng)建郵件發(fā)送的線程,向郵件服務(wù)器請求發(fā)送郵件.實現(xiàn)方法:
System.Threading.Thread thread=new System.Threading.Thread(new System.Threading.ThreadStart (myMail.send));∥創(chuàng)建一個線程;myMail是webMail類的實例
thread.Start();∥啟動線程
3.3 Web信息系統(tǒng)異步查詢業(yè)務(wù)進程的實現(xiàn) 郵件的發(fā)送是通過webMail類的myMail實例和多線程異步來完成的,所關(guān)心的信息(郵件發(fā)送是否正常,發(fā)送進度如何,用了多長時間)就保留在myMail對象中,只要在客戶端定時向服務(wù)器查詢該對象的屬性,就能動態(tài)知道郵件發(fā)送的相關(guān)情況.采用Ajax異步無刷新技術(shù),具體步驟為:
步驟1 在頁面中添加一個scriptManager控件,同時為了顯示信息,在頁面中加一個Label標(biāo)簽,另外用一個沙漏圖像來表示查詢正在進行中;
步驟2 在客戶端添加一個js文件,在該文件中設(shè)計一個定時器的Timer類[6],并且在scriptManager控件中引用該js文件;
步驟3 在客戶端創(chuàng)建定時器Timer類的對象,并初始化該對象.有了此定時器,可以輪詢服務(wù)器,不斷地獲取信息;
步驟4 為了在服務(wù)器端建立與客戶端的通信,在服務(wù)器端的頁面中需要實現(xiàn)ICallBackEventHandler接口.在接口的RaiseCallbackEvent事件中添加讀取myMail對象屬性的代碼,然后在GetCallbackResult事件中將屬性信息返回到客戶端;
步驟5 為了保證“用戶離開頁面,再返回該頁面”狀態(tài)信息顯示的連續(xù)性,在服務(wù)器的Page_load事件中,使用session對象來保存myMail對象,這一點是非常重要的[7].即
protected void Page_Load(object sender,EventArgs e)
{∥判斷Session["myMail"]是否存在;如果不存在,創(chuàng)建一個webMail對象并∥保存在Session[" myMail"]中;如果存在,就從Session["myMail"]中讀出∥webMail對象.
步驟6 在客戶端定義CallServer和ReceiveServerData函數(shù),其中CallServer函數(shù)用于向服務(wù)器端發(fā)送請求,ReceiveServerData函數(shù)將接收到的數(shù)據(jù)顯示到客戶端.客戶端與服務(wù)器端通信的過程如圖5所示[8].
圖5 客戶端與服務(wù)器端通信過程
步驟7 由于要動態(tài)的讀取郵件的發(fā)送信息,在客戶端定時器的OnTick事件中添加對CallServer函數(shù)的調(diào)用,并在ReCeiveServerData函數(shù)中刷新狀態(tài)信息.這樣,就能跟蹤?quán)]件發(fā)送的過程,隨時掌握發(fā)送信息.
Web信息系統(tǒng)異步編程模式是客觀存在的一種相對于同步模式的程序設(shè)計模式,其思路和方法完全不同于后者,其將Ajax技術(shù)和多線程技術(shù)有機地結(jié)合起來,用于Web信息系統(tǒng)的開發(fā)中,有效地解決同步模式中的程序阻塞與進程查詢問題.同步模式和異步模式在Web信息系統(tǒng)的開發(fā)中互為補充,各有所長,只有將二者結(jié)合起來,才能夠發(fā)揮各自的作用,開發(fā)出高質(zhì)量的軟件.
筆者在在線圖書管理信息系統(tǒng)項目的開發(fā)中,利用Web信息系統(tǒng)異步編程模式,有效地解決了大批量電子郵件的發(fā)送及進度顯示中的問題;除此之外,該模式還可導(dǎo)入Excel文件,生成Excel報表等,并在多個地方使用,其效果很好.
[1]季久峰.Asp.NET開發(fā)答疑[M].北京:人民郵電出版社,2004:390-393.
[2]黃樂.一個基于多線程的.NET開發(fā)應(yīng)用實例研究[J].計算機與現(xiàn)代化,2006(7):59-61.
[3]甘群文..C#多線程同步與異步的實現(xiàn)[J].電腦開發(fā)與應(yīng)用,2009(9):35-40.
[4]王健南.Asp.NET Ajax中的Web Services調(diào)用[J].農(nóng)業(yè)網(wǎng)絡(luò)信息,2007(12):173-174.
[5]李海.深入研究Visual Basic.NET[M].北京:電子工業(yè)出版社,2003:104-115.
[6]文博.Asp.NET Ajax客戶端編程淺析[J].中國科技信息,2008(1):108-109.
[7]陳偉,衛(wèi)琳.Asp.NET 3.5網(wǎng)站開發(fā)實例教程[M].北京:清華大學(xué)出版社,2009:43-45.
[8]章立民.Asp.NET 3.5 Ajax客戶端編程精選166例[M].北京:科學(xué)出版社,2009:554-580.
Mode of Asynchronous Programming in Web Information System
GE Zhong-ze,ZOU Rui
(Department of Computer Science,Ezhou University,Ezhou 436000,China)
During the development of Web Information System,the Multithread Technology and Ajax Technology were combined,and the mode of asynchronous programming was put forth,and which can solve the problem that client part can not real-time read the processing information of the server part effectively.Based on the application to“the on-line books management information systems”for a year,it was proved that the mode is reliable and effective.
mode of asynchronous programming;mode of synchronous programming;Ajax;multithread
TP 319
A
1004-1729(2012)01-0036-05
2011-11-04
葛中澤(1969-),男,湖北鄂州人,鄂州大學(xué)計算機系副教授.