基于ASP的Web程序中MSMQ消息传递技术的应用
2009-07-02辛士光
[摘要]针对基于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程序运行超时和服务器等待而导致的访问失败。
作者简介:
辛士光,工学硕士,主研方向:网络和数据库、计算机基础教学。