需要注意的是在使用打开操作后返回了一个 MSMQQueue 对象。下面是一个典型的新建和删除操作例子: < % Dim objQueue Set objQueue = Server.CreateObject("MSMQ.MSMQQueueInfo") objQueue.PathName = "./MyQu" objQueue.Create %>
< % Dim objQueue Set objQueue = Server.CreateObject("MSMQ.MSMQQueueInfo") objQueue.PathName = "./MyQu" objQueue.Delete %>
( 2 )、 MSMQQueue
MSMQQueue 类用来描述一个在 MSMQ 服务中打开的队列。该类提供了一个用来在指针队列中的消息进行循环的功能。你不能够打开一个使用了 MSMQQueue 类的队列要这么干只能够使用 MSQMQueueInfo (见上例),虽然许多 ASP 运用程序通常使用 MSMQ 来发消息,但是很多时候也需要 ASP 来显示这个消息的具体内容。
获取消息的方式有两种:同步方式,异步方式,但是 ASP 只能够使用同步方式。这是因为 ASP 不能够在服务端申明一个 WithEvents 变量。
下面先举一个异步方式使用 MSMQ 的例子(仅 VB 中) Option Explicit Dim m_objQueueInfo As New MSMQQueueInfo Dim m_objQueue As MSMQQueue Dim WithEvents m_objMSMQEvent As MSMQEvent
PRivate Sub Form_Load() m_objQueueInfo.PathName = "./MyQu" m_objQueueInfo.Label = "My Sample Queue" On Error Resume Next m_objQueueInfo.Create On Error GoTo 0 Set m_objQueue = m_objQueueInfo.Open(MQ_RECEIVE_ACCESS, MQ_DENY_NONE)
Set m_objMSMQEvent = New MSMQEvent m_objQueue.EnableNotification m_objMSMQEvent, MQMSG_CURRENT, 1000 End Sub
Private Sub m_objMSMQEvent_Arrived(ByVal Queue As Object, ByVal Cursor As Long) Dim m_objMessage As MSMQMessage Set m_objMessage = Queue.PeekCurrent MsgBox "Message Received: " & m_objMessage.Label m_objQueue.EnableNotification m_objMSMQEvent, MQMSG_NEXT, 10000 End Sub
Private Sub m_objMSMQEvent_ArrivedError(ByVal Queue As Object, ByVal ErrorCode As Long, ByVal Cursor As Long) MsgBox "Error accorded: " & ErrorCode End Sub
这段代码首先建立一个队列(如果它还不存在的话)。然后 m_objMSMQEvent 对象通过调用 EnableNotification 连接到 MSMQQueue 对象。一旦连接到 MSMQEvent 对象 , 接下来需做的仅仅是完成 Arrived 和 Arrived_Error ( 可选的 ) 事件。 Arrived 事件当一个新的消息到达队列时将被触发该事件返回两个指针 , 一个是指向队列中应该从来开始读消息的位置,另外一个是当前的位置。如果发生错误,将触发 ArrivedError 事件当同步获取消息时,会一直等到消息可获取或则超时时程序才会不被挂起。代码如下: Public Sub DisplayMessages() Dim objQueueInfo As New MSMQQueueInfo Dim objQueue As MSMQQueue Dim objMessage As MSMQMessage objQueueInfo.PathName = "./MyQu" objQueueInfo.Label = "My Sample Queue"
On Error Resume Next objQueueInfo.Create On Error GoTo 0 Set objQueue = objQueueInfo.Open(MQ_RECEIVE_ACCESS, MQ_DENY_NONE) Do While True Set objMessage = objQueue.Peek(, , 1000) If objMessage Is Nothing Then Exit Do MsgBox "Message: " & objMessage.Label Loop MsgBox "No more new messages." objQueue.Close Set objMessage = Nothing Set objQueue = Nothing Set objQueueInfo = Nothing End Sub
( 3 )、 MSMQMessage
MSMQMessage 类支持队列中消息的所有属性。 MSMQ 消息有两个方法和繁多的属性。其中两个最主要的属性是: Body 和 LabeL 。最主要的方法有 Send 。有两种方法来获取消息: opening , peeking 。当使用 opening 方式后,该消息将会被删除掉;当使用 peeking 方式后,该消息仍然保存在队列中直到它过期。它们的返回值都是指向该消息的指针。下例的代码将打开一个消息,并显示其 Body 和 Label Private Sub LookForMessage() Dim objQInfo As New MSMQQueueInfo Dim objQReceive As MSMQQueue Dim objMessage As MSMQMessage objQInfo.PathName = "./test" Set objQReceive = objQInfo.Open(MQ_RECEIVE_ACCESS, MQ_DENY_NONE) Set objMessage = objQReceive.Receive(, , , 1000) If Not objMessage Is Nothing Then MsgBox objMessage.Label & " - " & objMessage.Body Else Msgbox "Nothing in the queue" End If objQReceive.Close Set objQInfo = Nothing Set objQReceive = Nothing Set objMessage = Nothing End Sub
这段代码打开一个队列并在该队列中查找消息,使用 Receive 方法,主要是设置一个 1000 微秒的超时 , 它告诉 MSMQ1000 微秒后停止查找设置一个非常段的超时的功能主要是用来检查是否存在消息而不是等候一个消息。也就是说如果你知识想看看是否有消息可以使用该方法。如果无消息,返回的指针为空 (If Not objMessage Is Nothing) 。下面是发送一个消息的代码: < % Dim objQInfo Dim objQSend Dim objMessage Set objQInfo = Server.CreateObject("MSMQ.MSMQQueueInfo") objQInfo.PathName = "./test" Set objQSend = objQInfo.Open(MQ_SEND_ACCESS, MQ_DENY_NONE) Set objMessage = Server.CreateObject("MSMQ.MSMQMessage") objMessage.Label = "This is the label." objMessage.Body = "This is the body." objMessage.Send objQSend objQSend.Close Set objQInfo = Nothing Set objQSend = Nothing Set objMessage = Nothing %>