设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: 阿罗
打印 上一主题 下一主题

在SQL服务器中使用MSMQ组件实现网络内异步通讯

[复制链接]
11#
 楼主| 发表于 2003-9-22 07:28:00 | 只看该作者
MSMQ技术文档:

http://www.microsoft.com/windows2000/technologies/communications/msmq/default.asp
12#
 楼主| 发表于 2003-9-22 07:33:00 | 只看该作者

张悦的文章抄录如下:

消息队列在VB.NET数据库开发中的应用
2003-05-06■张悦■yesky
===========================================
我们先简单的了解一下什么是消息队列(MSMQ)?消息队列是 Windows 2000(NT也有MSMQ,WIN95/98/me/xp不含消息队列服务但是支持客户端的运行)操作系统中通讯的基础,也是用于创建分布式、松散连接通讯应用程序的工具。这些应用程序可以通过不同种类的网络进行通讯,也可以与脱机的计算机通讯。消息队列分为用户创建队列和系统队列,用户队列分为:

  · "公共队列"在整个可传递消息的"消息队列"网络中复制并传输,并且有可能由网络连接的所有站点访问。

  · "专用队列"不在整个网络中发布。相反,它们仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。

  · "管理队列"包含确认在给定"消息队列"网络中发送的消息回执的消息。指定希望 MessageQueue 组件使用的管理队列

  · "响应队列"包含目标应用程序接收到消息时返回给发送应用程序的响应消息。指定希望 MessageQueue 组件使用的响应队列。

  系统队列分为:

  · "日记队列"可选地存储发送消息的副本和从队列中移除的消息副本。

  · "死信队列"存储无法传递或已过期的消息的副本。

  · "专用系统队列"是一系列存储系统执行消息处理操作所需的管理和通知消息的专用队列。

  现在大家对消息队列有了简单的了解后,就该进入主题了。要使用msmq进行软件开发需要安装msmq。安装完后就该进入实际的开发阶段。先打开vs.net ide中的"服务起资源管理器"展开你想建立消息队列的计算机名,再展开"消息队列"右击它在弹出菜单中选择"新建"建立一个新的消息队列,并为它指定一个名字,这个名字可以随意。也可以通过编程来完成,代码如下:

system.Messaging.MessageQueue.Create(".\Private$\MyPrivateQueue")'建立专用队列
System.Messaging.MessageQueue.Create("myMachine\MyQueue")'建立公共队列

  其实我认为使用那中方法并不重要,重要的是搞清楚专用队列和公共队列的差别(其他队列不是必须的)。在本例中是通过"服务器资源管理器"分别在服务器上建立了专用队列和公共队列。

  程序功能:本程序分为两部分包括服务器程序(安装在sql server服务器上)和客户端程序,客户端的作用是用来编写t-sql语句并将t-sql语句放在消息中,并将消息发送到sql server服务器上的消息队列中去。服务器程序检查指定的消息队列当发现有新消息到达时,就开始执行消息中的内容,由于消息中的内容是t-sql语句所以服务器端实际上是执行对数据库的操作。

  客户端程序:


public Sub client()
Dim tM As New System.Messaging.MessageQueue()
tM.Path = ".\Private$\jk" '"FORMATNAMEUBLIC=3d3dc813-c555-4fd3-8ce0-79d5b45e0d75"'与指定计算机中的消息队列建立连接,
Dim newMessage As New System.Messaging.Message(TextBox1.Text)'接受文本筐的t-sql语句
newMessage.Label = "This is the label"'消息名字,
tM.Send(newMessage)'发送消息
End Sub

  服务端程序:


public Sub server()
Dim NewQueue As New System.Messaging.MessageQueue(".\Private$\jk")'"FORMATNAMEUBLIC=3d3dc813-c555-4fd3-8ce0-79d5b45e0d75"'与指定计算机中的消息队列建立连接,
Dim m As System.Messaging.Message
'查看消息队列中的消息
m = NewQueue.Receive
m.Formatter = New System.Messaging.XmlMessageFormatter(New String() {"System.String,mscorlib"})
Dim st As String
st = m.Body'消息队列中消息的消息内容。既sql语句
Dim con As New OleDb.OleDbConnection("输入自己的数据库连接字符串")
con.Open()
Dim com As New OleDb.OleDbCommand(st, con)'执行消息中的sql语句
com.ExecuteNonQuery()
con.Close()
End Sub

  我为什么要使用消息队列来处理数据库的操作这个问题我一直没回答,现在我就来回答这个问题。在本程序中你会发现在sub client()中我并没连接数据库和请求数据,而是通过发消息来操作数据库的,这个好处是节省了两部分时间:

  1、对数据库连解请求数据的时间。

  2、从数据库返回数据的时间。

  在很多情况下其实我们并不需要看见具体的数据就知道该怎么修改数据库中的数据。例如要删除张三的记录,就可以将一条简单的删除语句放入消息中,发给服务器让服务器程序去处理对数据的更改。

  此外消息队列的另一个主要用途也就是当前erp软件中必不可少的,就是在断开连接时保存信息,当连接恢复时发送消息。消息在如下两种情况中无法迅速地传递到它们的队列:当队列驻留的计算机无法工作时,或当路由消息所需的域控制器无法工作时。"消息队列"可让您应对这些情况,使得在从网络上断开连接或必要的计算机或控制器无法工作时,仍可以继续发送消息。在这些情形下,消息暂时存储在本地计算机或传递路由上的某个计算机的队列中,直到完成传递所需的资源重新联机。

  
13#
 楼主| 发表于 2003-9-22 07:41:00 | 只看该作者
通过这两天寻找资料,觉得MSMQ的用处很大,远远超出上面提到的一些。通过我自己的实验,对于如何扩展SQL服务器的应用范围有了很好的概念性了解,对消息队列有了一些初步的认识。像这里以前讨论过的,过一段时间从工作场点向服务器传送数据,我想,MSMQ可以提供一个十分适合的、非常可靠的解决思路。希望各位朋友也来讨论切磋。
14#
 楼主| 发表于 2003-9-22 08:18:00 | 只看该作者
MSMQ3.0中增加了触发器(2.0版本现在也可以增加这个功能了。)
像张悦的那篇文章中,服务器端的程序,可以用MSMQ触发器来执行。而对于本论坛以前讨论的一个超市,工作站要定时将数据上报到服务器这么个问题,除了用MSMQ来解决这个思路以外,我想还可以在SQL服务器端用DTS来解决,这样,结合当时提出来的几种方案,就有多种候选办法。至于具体问题,还要看网络连接的情况、网络负荷、开发时间、预算、可靠性要求、安全性要求等等具体情况采用最好的解决办法。
15#
 楼主| 发表于 2003-9-23 20:18:00 | 只看该作者


MSMQ的FAQ。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
16#
 楼主| 发表于 2003-9-24 19:49:00 | 只看该作者
在工作组模式下,向局域网内其他电脑发送消息,如果另外一台电脑没有上线,则消息会放在本地的发送队列中。如果另外一台电脑上线,则会马上送达。在域的情况下,则消息的发送和储存会更灵活。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
17#
发表于 2003-11-5 19:01:00 | 只看该作者
太好了,能不能把您收集的资料给我发一份?在下先行谢过。E-MAIL:sxhmft@vip.sina.com
18#
 楼主| 发表于 2003-11-5 19:59:00 | 只看该作者
所有我找到的资料都在这个帖子里了。更详细的东西,需要去msdn,都是英文资料。也可以到M$的新闻组去提问。这就是我所有的秘诀。
19#
发表于 2003-11-5 21:08:00 | 只看该作者
好好!谢谢您。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-29 17:17 , Processed in 0.103615 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表