COM+系列——实战演练MSMQ(消息队列)(一)
龙卷风
关键字:COM+,MSMQ.
?
概述:
谈起消息队列,不能不提起COM+。实际上COM+是三种技术的结合:DCOM、MTS和MSMQ。
我们先了解一下什么是消息队列(MSMQ)?MSMQ(MicroSoft??Message??Queue,微软消息队列)是 Windows 2000(NT也有MSMQ,WIN95/98/me/xp不含消息队列服务但是支持客户端的运行)操作系统中通讯的基础,也是用于创建分布式、松散连接通讯应用程序的工具。这些应用程序可以通过不同种类的网络进行通讯,也可以与脱机的计算机通讯。
MSMQ是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message??Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。
MSMQ的最重要的特点就是,就是在断开连接时保存信息,当连接恢复时发送消息。
一个应用是客户机之间的异步数据传输。最简单的一个应用是,用户完成当天的工作,晚上在家用电脑上把数据以消息的形式传出去,当用户第二天登陆的时候,办公室的电脑将会接受到传送过来的消息并对数据进行更新。
要使用MSMQ进行软件开发需要安装MSMQ。打开”控制面板”,’添加或删除程序”,”添加删除Windows组件”,选择”消息队列”。
我们使用VB作为开发工具,主要考虑到VB与COM+的结合紧密性和VB的简单易用性,从而可以使用户更容易接受COM+。
安装完后就该进入实际的开发阶段。打开”控制面板”,”管理工具”,”计算机管理”,”消息队列”。建立一个新的消息队列(专用队列),并为它指定一个名字,假设为TestQueue,这个名字可以随意。也可以通过编程来完成。
Windows NT和Windows2000,WinXP版本的MSMQ有区别。Windows NT使用MSMQ1.0(MQOA10.TLB),Windows2000使用MSMQ2.0(MQOA20.TLB),WINXP使用MSMQ3.0(MQOA.DLL)
开发环境:WinXP+VB6
消息的发送程序:
Option Explicit
'引用Microsoft Message Queue 3.0 Object Library
Private Sub cmdSend_Click()
??? '创建MSMQ需要的变量
??? Dim qInfo As MSMQQueueInfo
??? Dim qObject As MSMQQueue
??? Dim qMessage As MSMQMessage
???
??? '实例化队列信息
??? Set qInfo = New MSMQQueueInfo
???
??? '队列路径
??? qInfo.PathName = "./Private$/TestQueue"
??? '队列名称
??? qInfo.Label = "Test Queue"
??? '队列优先权,支持八种。MQ_MIN_PPRIORITY是最低级,MQ_MAX_PRIORITY是最高级
??? qInfo.BasePriority = MQ_MIN_PRIORITY
???
??? '如果队列不存在,则创建
??? On Error GoTo CheckQueue:
??? qInfo.Create False, False
??? GoTo QueueCreated:
???
CheckQueue:
??? If Not Err.Number = MQ_ERROR_QUEUE_EXISTS Then
??????? MsgBox "错误: " + Hex(Err.Number) + Err.Source + Err.Description, vbCritical + vbOKOnly, "信息提示"
??? End If
???
QueueCreated:
??? '打开
??? Set qObject = qInfo.Open(MQ_SEND_ACCESS, MQ_DENY_NONE)
???
??? Set qMessage = New MSMQMessage
???????
??? '填充信息
??? qMessage.Label = txtMsgLabel.Text '消息标题
??? qMessage.Body = txtMsgBody.Text '消息内容
??? qMessage.Priority = lstPriority.Text '优先权(直接指定0-7数字即可)
???
??? '发送消息
??? qMessage.Send qObject, MQ_NO_TRANSACTION
???
??? '关闭
??? qObject.Close
???
??? '释放
??? Set qInfo = Nothing
??? Set qObject = Nothing
??? Set qMessage = Nothing
End Sub
运行程序后,输入内容,选择优先级,发送。打开消息队列可以看到,如下图所示:
?
消息的接收程序:部分注释与上面的相同
Option Explicit
Dim qInfo As MSMQQueueInfo
Dim qObject As MSMQQueue
Dim qMessage As MSMQMessage
?
Private Sub cmdNext_Click()
??? Set qInfo = New MSMQQueueInfo
???
??? qInfo.PathName = "./Private$/TestQueue"
??? qInfo.Label = "Test Queue"
??? '这种方式会将消息队列中的消息删除
??? 'Set qObject = qInfo.Open(MQ_RECEIVE_ACCESS,MQ_DENY_NONE)
??? 'Set qMessage = qObject.Receive(MQ_NO_TRANSACTION, False, True, 5)
??? '这种方式不会删除消息队列中的消息
??? Set qObject = qInfo.Open(MQ_PEEK_ACCESS, MQ_DENY_NONE)
??? Set qMessage = qObject.Peek(MQ_NO_TRANSACTION, False, True, 5)
???
??? If qMessage Is Nothing Then
??????? MsgBox "消息队列中没有消息", vbInformation + vbOKOnly, "信息提示"
??????? GoTo NoMessage:
??? Else
???????
??? lblMsgLabel.Caption = qMessage.Label
??? lblMsgBody.Caption = qMessage.Body
??? lblPriorityLevel.Caption = qMessage.Priority
??? lblArrivalTime.Caption = qMessage.ArrivedTime
??? End If
???
NoMessage:
??? qObject.Close
???
??? Set qInfo = Nothing
??? Set qObject = Nothing
??? Set qMessage = Nothing
??? Exit Sub
???
CheckQueue:
??? MsgBox "错误: " + Hex(Err.Number) + Err.Source + Err.Description, vbCritical + vbOKOnly, "信息提示"
End Sub
?
运行后,就可以看到消息了
?
消息队列还有其他的用法,比如,最为关心的数据库操作,及时响应客户端的发送消息等等。
不得不说的是,MSMQ不宜在以下情况中使用:
1.? 对时间要求很高的场合下.MSMQ的主要是对数据进行延迟处理
2.? 对消息大小要求高。MSMQ会增大传送消息的字节。即使不加密,MSMQ为了便于追踪,会在消息后附加信息
3.? 虽然可以做聊天程序,远程控制程序。但是不推荐。
?
学习的最好方式是写出来。我将在后面的章节中继续与大家讨论。
?