[摘要]針對基于ASP開發的Web應用,比如網絡教學系統,學生作業等大量信息傳遞時存在的系統“擁堵”問題,提出應用MSMQ技術的解決方案,以及在ASP應用程序中隊列的建立、消息發送、消息讀取的實現方法。
[關鍵詞]Web應用 網絡教學系統 消息隊列 異步消息傳遞 ASP
中圖分類號:TP3文獻標識碼:A文章編號:1671-7597(2009)0520043-01
ASP開發的應用系統,在大量并發用戶訪問時,如網絡教學系統中大量學生作業的上交,常常會遇到這些情況:某個ASP程序花費了過長的時間而過期或服務器上阻塞了大量的死隊列,導致訪問失敗。此類問題我們可以使用MSMQ技術進行解決。
一、什么是Microsoft Message Queue
MSMQ(MicroSoft Message Queue,微軟消息隊列)是運行在Windows NT的服務,可以使用“添加/刪除程序”中的“添加/刪除Windows組件”安裝。MSMQ是在多個不同的應用之間實現相互通信的一種異步傳輸模式。相互通信的應用可以分布于同一臺機器上,也可以分布于網絡中的任一位置,通信的雙方可以是不同的物理平臺。MSMQ的實現原理是:消息的發送者把自己想要發送的信息放入一個容器中(我們稱之為Message),然后把它保存至一個系統公用空間的消息隊列(Message Queue)中;本地或者異地的消息接收程序再從該隊列中取出發給它的消息進行處理。這些隊列能夠確保MSMQ的傳送,而不管當前網絡連接的狀況如何。在基于ASP的應用,消息的發送者通常是IIS。
采用MSMQ的好處是:由于是異步通信,無論是發送方還是接收方都不用等待對方返回成功消息,只要消息成功發送出去,就可以認為處理完成,就可以執行余下的代碼,同時信息發送機制還具有一定的故障恢復能力,因而大大地提高了事務處理的能力。
MSMQ有一個COM API(mqoa.dll)提供給開發者用于ASP應用程序的開發中。其中最常用的三個類為:MSMQQueueInfo、MSMQQueue、MSMQMessage。
(1)MSMQQueueInfo類用來新建、打開、刪除隊列中的消息。(2)MSMQQueue類用來描述一個在MSMQ服務中打開的隊列。(3)MSMQMessage類支持隊列中消息的所有屬性和方法。屬性:Body和LabeL設定獲取消息的方式有:同步方式或異步方式。常用方法:Send、Opening、Peeking。
二、如何在ASP開發教學輔助系統中應用MSMQ技術
首先通過MSMQQueueInfo類建立一本地消息隊列,保存在“.StuQueu
E”中,學生通過MSMQMessage類向隊列中發送消息(學生作業等),教師通過MSMQQueueInfo類讀取消息隊列中的作業內容進行相應的處理。如圖2-1所示。

1.隊列的建立:設置隊列的位置PathName,打開隊列時有兩個參數:Access 和 ShareMode。Access表示將要對隊列執行什么操作,其中MQ_PEEK_ACCESS用來在特定的隊列中查找消息,但對該消息不進行操作。MQ_RECEIVE_ACCESS用來在讀取隊列中的消息后刪除它。MQ_SEND_ACCESS 用來在隊列中發送消息,但不接收消息。
<%Dim objQueueInfo
Dim objQueue
Set objQueueInfo=Server.CreateObject("MSMQ.MSMQQueueInfo")
objQueue.PathName = ".StuQueue"'設置本地隊列的位置
Set objQueue = objQueueInfo.Open(MQ_SEND_ACCESS,MQ_DENY_NONE)
%>
2.向隊列中發送消息:
< % Dim objQInfo
Dim objQSend
Dim objMessage
Dim strMessage
Set objQInfo = Server.CreateObject("MSMQ.MSMQQueueInfo")
objQInfo.PathName = ".StuQueue" 設置本地隊列的位置
Set objQSend = objQInfo.Open(MQ_SEND_ACCESS,MQ_DENY_NONE)
Set objMessage = Server.CreateObject("MSMQ.MSMQMessage")
......[省略若干行]
objMessage.Body = strMessage '設定要發送的消息(學生作業)
objMessage.Send objQSend'講學生作業發送到隊列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" '設置本地隊列的位置
Set objQReceive = objQInfo.Open(MQ_RECEIVE_ACCESS, MQ_DENY_NONE)
Do while Not objMessage Is Nothing
Set objMessage = objQReceive.Receive(, , , 1000)'設置超時時長為1000ms
Response.Write objMessage.Body'分別讀取并顯示隊列中消息的內容
Loop
objQReceive.Close
Set objQInfo = Nothing
Set objQReceive = Nothing
Set objMessage = Nothing
%>
三、結論
本文所給出的在ASP應用開發中采用MSMQ技術的異步Web服務模型,很好地解決了異步消息傳遞,為通信雙方提供了松散的異步交互環境,該模型為網絡教學系統中大量非實時的數據傳輸和處理帶來了很好的可靠性和靈活性。很好地解決了由于ASP程序運行超時和服務器等待而導致的訪問失敗。
作者簡介:
辛士光,工學碩士,主研方向:網絡和數據庫、計算機基礎教學。