[摘要]針對(duì)基于A(yíng)SP開(kāi)發(fā)的Web應(yīng)用,比如網(wǎng)絡(luò)教學(xué)系統(tǒng),學(xué)生作業(yè)等大量信息傳遞時(shí)存在的系統(tǒng)“擁堵”問(wèn)題,提出應(yīng)用MSMQ技術(shù)的解決方案,以及在A(yíng)SP應(yīng)用程序中隊(duì)列的建立、消息發(fā)送、消息讀取的實(shí)現(xiàn)方法。
[關(guān)鍵詞]Web應(yīng)用 網(wǎng)絡(luò)教學(xué)系統(tǒng) 消息隊(duì)列 異步消息傳遞 ASP
中圖分類(lèi)號(hào):TP3文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1671-7597(2009)0520043-01
ASP開(kāi)發(fā)的應(yīng)用系統(tǒng),在大量并發(fā)用戶(hù)訪(fǎng)問(wèn)時(shí),如網(wǎng)絡(luò)教學(xué)系統(tǒng)中大量學(xué)生作業(yè)的上交,常常會(huì)遇到這些情況:某個(gè)ASP程序花費(fèi)了過(guò)長(zhǎng)的時(shí)間而過(guò)期或服務(wù)器上阻塞了大量的死隊(duì)列,導(dǎo)致訪(fǎng)問(wèn)失敗。此類(lèi)問(wèn)題我們可以使用MSMQ技術(shù)進(jìn)行解決。
一、什么是Microsoft Message Queue
MSMQ(MicroSoft Message Queue,微軟消息隊(duì)列)是運(yùn)行在Windows NT的服務(wù),可以使用“添加/刪除程序”中的“添加/刪除Windows組件”安裝。MSMQ是在多個(gè)不同的應(yīng)用之間實(shí)現(xiàn)相互通信的一種異步傳輸模式。相互通信的應(yīng)用可以分布于同一臺(tái)機(jī)器上,也可以分布于網(wǎng)絡(luò)中的任一位置,通信的雙方可以是不同的物理平臺(tái)。MSMQ的實(shí)現(xiàn)原理是:消息的發(fā)送者把自己想要發(fā)送的信息放入一個(gè)容器中(我們稱(chēng)之為Message),然后把它保存至一個(gè)系統(tǒng)公用空間的消息隊(duì)列(Message Queue)中;本地或者異地的消息接收程序再?gòu)脑撽?duì)列中取出發(fā)給它的消息進(jìn)行處理。這些隊(duì)列能夠確保MSMQ的傳送,而不管當(dāng)前網(wǎng)絡(luò)連接的狀況如何。在基于A(yíng)SP的應(yīng)用,消息的發(fā)送者通常是IIS。
采用MSMQ的好處是:由于是異步通信,無(wú)論是發(fā)送方還是接收方都不用等待對(duì)方返回成功消息,只要消息成功發(fā)送出去,就可以認(rèn)為處理完成,就可以執(zhí)行余下的代碼,同時(shí)信息發(fā)送機(jī)制還具有一定的故障恢復(fù)能力,因而大大地提高了事務(wù)處理的能力。
MSMQ有一個(gè)COM API(mqoa.dll)提供給開(kāi)發(fā)者用于A(yíng)SP應(yīng)用程序的開(kāi)發(fā)中。其中最常用的三個(gè)類(lèi)為:MSMQQueueInfo、MSMQQueue、MSMQMessage。
(1)MSMQQueueInfo類(lèi)用來(lái)新建、打開(kāi)、刪除隊(duì)列中的消息。(2)MSMQQueue類(lèi)用來(lái)描述一個(gè)在MSMQ服務(wù)中打開(kāi)的隊(duì)列。(3)MSMQMessage類(lèi)支持隊(duì)列中消息的所有屬性和方法。屬性:Body和LabeL設(shè)定獲取消息的方式有:同步方式或異步方式。常用方法:Send、Opening、Peeking。
二、如何在A(yíng)SP開(kāi)發(fā)教學(xué)輔助系統(tǒng)中應(yīng)用MSMQ技術(shù)
首先通過(guò)MSMQQueueInfo類(lèi)建立一本地消息隊(duì)列,保存在“.StuQueu
E”中,學(xué)生通過(guò)MSMQMessage類(lèi)向隊(duì)列中發(fā)送消息(學(xué)生作業(yè)等),教師通過(guò)MSMQQueueInfo類(lèi)讀取消息隊(duì)列中的作業(yè)內(nèi)容進(jìn)行相應(yīng)的處理。如圖2-1所示。
1.隊(duì)列的建立:設(shè)置隊(duì)列的位置PathName,打開(kāi)隊(duì)列時(shí)有兩個(gè)參數(shù):Access 和 ShareMode。Access表示將要對(duì)隊(duì)列執(zhí)行什么操作,其中MQ_PEEK_ACCESS用來(lái)在特定的隊(duì)列中查找消息,但對(duì)該消息不進(jìn)行操作。MQ_RECEIVE_ACCESS用來(lái)在讀取隊(duì)列中的消息后刪除它。MQ_SEND_ACCESS 用來(lái)在隊(duì)列中發(fā)送消息,但不接收消息。
<%Dim objQueueInfo
Dim objQueue
Set objQueueInfo=Server.CreateObject("MSMQ.MSMQQueueInfo")
objQueue.PathName = ".StuQueue"'設(shè)置本地隊(duì)列的位置
Set objQueue = objQueueInfo.Open(MQ_SEND_ACCESS,MQ_DENY_NONE)
%>
2.向隊(duì)列中發(fā)送消息:
< % Dim objQInfo
Dim objQSend
Dim objMessage
Dim strMessage
Set objQInfo = Server.CreateObject("MSMQ.MSMQQueueInfo")
objQInfo.PathName = ".StuQueue" 設(shè)置本地隊(duì)列的位置
Set objQSend = objQInfo.Open(MQ_SEND_ACCESS,MQ_DENY_NONE)
Set objMessage = Server.CreateObject("MSMQ.MSMQMessage")
......[省略若干行]
objMessage.Body = strMessage '設(shè)定要發(fā)送的消息(學(xué)生作業(yè))
objMessage.Send objQSend'講學(xué)生作業(yè)發(fā)送到隊(duì)列objQSend
......[省略若干行]
objQSend.Close
Set objQInfo = Nothing
Set objQSend = Nothing
Set objMessage = Nothing
%>
3.從隊(duì)列讀取消息:
<% Dim objQInfo
Dim objMessage
Dim objQReceive
Set objQInfo = Server.CreateObject("MSMQ.MSMQQueueInfo")
objQInfo.PathName = ".StuQueue" '設(shè)置本地隊(duì)列的位置
Set objQReceive = objQInfo.Open(MQ_RECEIVE_ACCESS, MQ_DENY_NONE)
Do while Not objMessage Is Nothing
Set objMessage = objQReceive.Receive(, , , 1000)'設(shè)置超時(shí)時(shí)長(zhǎng)為1000ms
Response.Write objMessage.Body'分別讀取并顯示隊(duì)列中消息的內(nèi)容
Loop
objQReceive.Close
Set objQInfo = Nothing
Set objQReceive = Nothing
Set objMessage = Nothing
%>
三、結(jié)論
本文所給出的在A(yíng)SP應(yīng)用開(kāi)發(fā)中采用MSMQ技術(shù)的異步Web服務(wù)模型,很好地解決了異步消息傳遞,為通信雙方提供了松散的異步交互環(huán)境,該模型為網(wǎng)絡(luò)教學(xué)系統(tǒng)中大量非實(shí)時(shí)的數(shù)據(jù)傳輸和處理帶來(lái)了很好的可靠性和靈活性。很好地解決了由于A(yíng)SP程序運(yùn)行超時(shí)和服務(wù)器等待而導(dǎo)致的訪(fǎng)問(wèn)失敗。
作者簡(jiǎn)介:
辛士光,工學(xué)碩士,主研方向:網(wǎng)絡(luò)和數(shù)據(jù)庫(kù)、計(jì)算機(jī)基礎(chǔ)教學(xué)。