COM+系列——实战演练MSMQ(消息队列)(一)

原创 2004年07月07日 12:06:00

COM+系列——实战演练MSMQ(消息队列)()

龙卷风

关键字:COM+,MSMQ.

?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

概述:

谈起消息队列,不能不提起COM+实际上COM+是三种技术的结合:DCOMMTSMSMQ

我们先了解一下什么是消息队列(MSMQ)?MSMQ(MicroSoft??Message??Queue,微软消息队列) Windows 2000(NT也有MSMQ,WIN95/98/me/xp不含消息队列服务但是支持客户端的运行)操作系统中通讯的基础,也是用于创建分布式、松散连接通讯应用程序的工具。这些应用程序可以通过不同种类的网络进行通讯,也可以与脱机的计算机通讯。

MSMQ是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message??Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。

MSMQ的最重要的特点就是,就是在断开连接时保存信息,当连接恢复时发送消息。

一个应用是客户机之间的异步数据传输。最简单的一个应用是,用户完成当天的工作,晚上在家用电脑上把数据以消息的形式传出去,当用户第二天登陆的时候,办公室的电脑将会接受到传送过来的消息并对数据进行更新。

要使用MSMQ进行软件开发需要安装MSMQ。打开控制面板”,’添加或删除程序”,”添加删除Windows组件,选择消息队列

我们使用VB作为开发工具,主要考虑到VBCOM+的结合紧密性和VB的简单易用性,从而可以使用户更容易接受COM+

安装完后就该进入实际的开发阶段。打开控制面板”,”管理工具计算机管理消息队列。建立一个新的消息队列(专用队列),并为它指定一个名字,假设为TestQueue,这个名字可以随意。也可以通过编程来完成。

Windows NTWindows2000,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

运行程序后,输入内容,选择优先级,发送。打开消息队列可以看到,如下图所示:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

?

消息的接收程序:部分注释与上面的相同

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.? 虽然可以做聊天程序,远程控制程序。但是不推荐。

?

学习的最好方式是写出来。我将在后面的章节中继续与大家讨论。

?

多线程消息队列 (MSMQ) 触发器

 要:本文论述了各种模式的线程(单线程、单元线程和自由线程)以及每种模式的使用方法。同时,还提供了一个使用线程的 C# 语言代码示例,以帮助您编写使用线程的应用程序。本文还讨论了多线程代码中的一些重要...
  • godson_h
  • godson_h
  • 2008-12-30 13:38:00
  • 5150

使用Msmq触发器

MSMQ之触发器 使用 msmq 中的trigger 可以主动启动Exe程序并设定要传什么参数,比自己写代码轮询一个queue 中的消息,则方便很多。 安裝 MSM...
  • lianqizhi
  • lianqizhi
  • 2012-11-14 17:45:11
  • 2679

触发器(trigger):监视某种情况,并触发某种操作。

yuanlie 触发器(trigger):监视某种情况,并触发某种操作。 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触...
  • nash603
  • nash603
  • 2014-11-24 15:47:10
  • 1066

about MSMQ

我们先简单的了解一下 什么是消息队列(MSMQ)?消息队列是 Windows 2000(NT也有MSMQ,WIN95/98/me/xp不含消息队列服务但是支持客户端的运行)操作系统中通讯的基础,也是用...
  • msonchina
  • msonchina
  • 2007-01-03 14:44:00
  • 746

COM+系列——实战演练MSMQ(消息队列)(二)

COM+系列——实战演练MSMQ(消息队列)(二) 龙卷风 关键字:COM+,MSMQ. ? 概述: 如何在MSMQ中传递ADO记录集可能是许多人比较关心的话题。这就意味着可以传递一些复杂的东西,如二...
  • online
  • online
  • 2004-07-07 12:09:00
  • 2790

MSMQ 消息队列、监听MSMQ消息、消息扫描

namespace FSMP.PTS.MSMQ { public class MSMQHelper     {         ///          /// MSMQ服务地址配置       ...
  • michaelgong
  • michaelgong
  • 2015-01-26 09:22:26
  • 8562

Windows消息队列(MSMQ)代码

引用System.Messaging类库 using System; using System.Collections.Generic; using System.Linq; us...
  • u012864987
  • u012864987
  • 2015-03-09 18:10:31
  • 285

COM+系列——实战演练MSMQ(消息队列)(一)

COM+系列——实战演练MSMQ(消息队列)(一) 龙卷风 关键字:COM+,MSMQ. ? 概述: 谈起消息队列,不能不提起COM+。实际上COM+是三种技术的结合:DCOM、MTS和MSMQ。 我...
  • online
  • online
  • 2004-07-07 12:06:00
  • 3619

关于MSMQ 队列无权删除的处理方法

我看到有的伙伴已经遇到过这种方法,并且提出了处理方法。 原文如下:http://blog.sina.com.cn/s/blog_48c75ce20102uycq.html 在操作MSM...
  • huangyi003
  • huangyi003
  • 2017-03-30 17:40:27
  • 554

如何安装消息队列(MSMQ)

1.在 Windows Server 2008 or Windows Server 2008 R2 上安装消息队列 4.0 在服务器管理器中,单击“功能”。 在“功能摘要”下的右窗...
  • daiyue945
  • daiyue945
  • 2011-08-25 10:26:35
  • 8275
收藏助手
不良信息举报
您举报文章:COM+系列——实战演练MSMQ(消息队列)(一)
举报原因:
原因补充:

(最多只允许输入30个字)