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