我们先简单的了解一下什么是消息队列(MSMQ)?消息队列是 Windows
(NT也有MSMQ
WIN
/
/me/xp不含消息队列服务但是支持客户端的运行)操作系统中通讯的基础
也是用于创建分布式
松散连接通讯应用程序的工具
这些应用程序可以通过不同种类的网络进行通讯
也可以与脱机的计算机通讯
消息队列分为用户创建队列和系统队列
用户队列分为
· 公共队列在整个可传递消息的消息队列网络中复制并传输并且有可能由网络连接的所有站点访问
· 专用队列不在整个网络中发布相反它们仅在所驻留的本地计算机上可用专用队列只能由知道队列的完整路径名或标签的应用程序访问
· 管理队列包含确认在给定消息队列网络中发送的消息回执的消息指定希望 MessageQueue 组件使用的管理队列
· 响应队列包含目标应用程序接收到消息时返回给发送应用程序的响应消息指定希望 MessageQueue 组件使用的响应队列
系统队列分为
· 日记队列可选地存储发送消息的副本和从队列中移除的消息副本
· 死信队列存储无法传递或已过期的消息的副本
· 专用系统队列是一系列存储系统执行消息处理操作所需的管理和通知消息的专用队列
现在大家对消息队列有了简单的了解后就该进入主题了要使用msmq进行软件开发需要安装msmq安装完后就该进入实际的开发阶段先打开vsnet ide中的服务起资源管理器展开你想建立消息队列的计算机名再展开消息队列右击它在弹出菜单中选择新建建立一个新的消息队列并为它指定一个名字这个名字可以随意也可以通过编程来完成代码如下
systemMessagingMessageQueueCreate(\Private$\MyPrivateQueue)建立专用队列
SystemMessagingMessageQueueCreate(myMachine\MyQueue)建立公共队列
其实我认为使用那中方法并不重要重要的是搞清楚专用队列和公共队列的差别(其他队列不是必须的)在本例中是通过服务器资源管理器分别在服务器上建立了专用队列和公共队列
程序功能本程序分为两部分包括服务器程序(安装在sql server服务器上)和客户端程序客户端的作用是用来编写tsql语句并将tsql语句放在消息中并将消息发送到sql server服务器上的消息队列中去服务器程序检查指定的消息队列当发现有新消息到达时就开始执行消息中的内容由于消息中的内容是tsql语句所以服务器端实际上是执行对数据库的操作
客户端程序
public Sub client()
Dim tM As New SystemMessagingMessageQueue()
tMPath = \Private$\jk FORMATNAME:PUBLIC=ddccfdcedbed与指定计算机中的消息队列建立连接
Dim newMessage As New SystemMessagingMessage(TextBoxText)接受文本筐的tsql语句
newMessageLabel = This is the label消息名字
tMSend(newMessage)发送消息
End Sub
服务端程序
public Sub server()
Dim NewQueue As New SystemMessagingMessageQueue(\Private$\jk)FORMATNAME:PUBLIC=ddccfdcedbed与指定计算机中的消息队列建立连接
Dim m As SystemMessagingMessage
查看消息队列中的消息
m = NewQueueReceive
mFormatter = New SystemMessagingXmlMessageFormatter(New String() {SystemStringmscorlib})
Dim st As String
st = mBody消息队列中消息的消息内容既sql语句
Dim con As New OleDbOleDbConnection(输入自己的数据库连接字符串)
conOpen()
Dim com As New OleDbOleDbCommand(st con)执行消息中的sql语句
comExecuteNonQuery()
conClose()
End Sub
我为什么要使用消息队列来处理数据库的操作这个问题我一直没回答现在我就来回答这个问题在本程序中你会发现在sub client()中我并没连接数据库和请求数据而是通过发消息来操作数据库的这个好处是节省了两部分时间
对数据库连解请求数据的时间
从数据库返回数据的时间
在很多情况下其实我们并不需要看见具体的数据就知道该怎么修改数据库中的数据例如要删除张三的记录就可以将一条简单的删除语句放入消息中发给服务器让服务器程序去处理对数据的更改
此外消息队列的另一个主要用途也就是当前erp软件中必不可少的就是在断开连接时保存信息当连接恢复时发送消息消息在如下两种情况中无法迅速地传递到它们的队列当队列驻留的计算机无法工作时或当路由消息所需的域控制器无法工作时消息队列可让您应对这些情况使得在从网络上断开连接或必要的计算机或控制器无法工作时仍可以继续发送消息在这些情形下消息暂时存储在本地计算机或传递路由上的某个计算机的队列中直到完成传递所需的资源重新联机
例如假设有一个记录所有在出差的销售人员发送的订单的中央队列这些销售人员每天的大部分时间都以断开连接的方式工作记录来自客户站点的订单信息并且每天拨号连接一次将所有这些信息传输到中央队列中因为消息在发送方断开连接时仍可发送到队列所以销售人员可以在记录客户信息时立即发送他们的消息但系统会缓存这些消息直到晚间进行拨号连接为止
在断开连接时要怎么保存消息呢?向断开连接的队列发送消息同向可用队列发送消息的过程几乎完全相同当要向其发送的队列不可用时不必进行任何特殊的配置以使组件将消息存储在临时队列中在client代码的tMPath = \Private$\jk后面有一条注释语句其实这条语句就是实现向断开连接的队列发送消息的功能只要将tMPath = \Private$\jk这条语句换成tMPath = FORMATNAME:PUBLIC=ddccfdcedbed其中PUBLIC后面的数字是要发送到计算机的guid数字这个数字可以打开那台计算机的消息队列的属性看见使用这种方法就可以在断开连接的情况下保证对服务器的操作是有效现在运行这个程序后打开win中的开始》程序》管理工具》计算机管理在计算机管理窗口中展开服务和应用程序》消息队列》传出队列你将在右边的窗口中看见你建立的消息(如果你使用tMPath = \Private$\jk语句在计算机管理窗口中展开服务和应用程序》消息队列》专用队列可以看见你建立的队列)
其实消息队列的编程并不复杂但它在网络环境的程序开发中是非常有用的可以简化大量的开发过程和节省开发时间
其实消息队列的编程有很大的灵活性几乎可以解决网络编程的大部分问题比如聊天程序远程控制程序
本文针对消息队列做了一个简单的介绍并举了一个例来说明怎么在net下使用消息编程达到快速高效稳定的对数据库进行操作最后补充要说的是在internet中也一样可以使用消息队列只需要将tMPath = FORMATNAME:PUBLIC=ddccfdcedbed语句后面的数字变成消息队列所在服务器的数字就可以了但是要提醒大家的是使用消息在传输时将占有大量的带宽所以在不是必须的时候internet下的编程不要使用消息
在vbnetwin sql server 下通过