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

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

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

龙卷风

关键字:COM+,MSMQ.

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

概述:

如何在MSMQ中传递ADO记录集可能是许多人比较关心的话题。这就意味着可以传递一些复杂的东西,如二进制字段内容等。MSMQ消息体中可以直接传递记录集。因为ADO记录集组件实现了IpresistStream接口。

还有一个问题就是如何同步接收发送方发送的消息。尽管MSMQ是异步传输,但是同步传输还是比较重要的。MSMQ提供了Arrived事件,类似WINSOCK.来完成这个功能

下面我们使用例子来阐述上面的两个问题。

开发环境:WinXP+VB6

消息的发送程序:

Option Explicit

?

Private Sub cmdQuit_Click()

Unload Me

End Sub

?

'引用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

???

??? Dim conn As New ADODB.Connection

??? Dim rs As New ADODB.Recordset

??? conn.Open "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Password=;Initial Catalog=northwind;Data Source=localhost"

???

??? rs.CursorLocation = adUseClient

??? rs.Open "select * from employees", conn, adOpenStatic, adLockReadOnly

???

??? '填充信息

??? qMessage.Label = txtMsgLabel.Text '消息标题

??? qMessage.Body = rs '将记录集作为消息内容发送

??? 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 New MSMQQueueInfo

Dim qObject As MSMQQueue

Dim WithEvents qMSMQEvent As MSMQEvent

'引用Microsoft Message Queue 3.0 Object Library

?

Private Sub cmdQuit_Click()

Unload Me

End Sub

?

Private Sub Form_Load()

??? '队列路径

??? 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_RECEIVE_ACCESS, MQ_DENY_NONE)

???

??? '连接事件

??? Set qMSMQEvent = New MSMQEvent

??? qObject.EnableNotification qMSMQEvent, MQMSG_CURRENT, 1000

End Sub

Private Sub qMSMQEvent_Arrived(ByVal Queue As Object, ByVal Cursor As Long)

? '获取当前消息

? Dim qMessage As MSMQMessage

? Set qMessage = Queue.PeekCurrent

? MsgBox "有新消息来了" & qMessage.Label

?

? lblMsgLabel.Caption = qMessage.Label

? Dim rs As New ADODB.Recordset

? Set rs = qMessage.Body

? Set DataGrid1.DataSource = rs

?

? '得到下一条

? qObject.EnableNotification qMSMQEvent, MQMSG_NEXT, 10000

End Sub

?

Private Sub qMSMQEvent_ArrivedError(ByVal Queue As Object, ByVal ErrorCode As Long, ByVal Cursor As Long)

? MsgBox "发生错误" & ErrorCode

End Sub

?

?

运行后,就可以看到消息了,如下图所示:

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

?

MSMQ的内容暂时告一段落。希望我们能够交流。

源代码下载:

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

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

C#实战Microsoft Messaging Queue(MSMQ)消息队列(干货)

http://www.cnblogs.com/beimeng/p/3298190.html
  • codefighting
  • codefighting
  • 2013年09月26日 17:03
  • 2043

【消息队列】MSMQ(二)——消息处理流程

一、前言      上一篇博客简单的向大家介绍了一下MSMQ的一些简单的概念。所以在这篇博客中小编就和大家一起进行一些对消息的处理,包括了创建消息、发送消息、接收消息、异步消息处理。其中整体上还是比较...
  • kisscatforever
  • kisscatforever
  • 2017年03月18日 20:13
  • 1157

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

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

如何安装消息队列(MSMQ)

1.在 Windows Server 2008 or Windows Server 2008 R2 上安装消息队列 4.0 在服务器管理器中,单击“功能”。 在“功能摘要”下的右窗...
  • daiyue945
  • daiyue945
  • 2011年08月25日 10:26
  • 7801

MSMQ消息队列与WCF MSMQ的认识与使用

先说一下MSMQ MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布...
  • xiaoyiyz
  • xiaoyiyz
  • 2015年03月19日 11:20
  • 2142

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

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

WINDOWS消息队列管理的工具--QueueExplorer

QueueExplorer是微软MSMQ的一个管理工具,它可以实现复制,移动,删除消息,进行压力测试,查看和修改消息体,并且还能管理远程的消息队列。 对于开发人员和测试人员来说: 1。对测试消息...
  • wem520
  • wem520
  • 2013年10月12日 10:06
  • 2799

消息队列--MSMQ应用(一)

消息队列是什么?     消息队列是在消息传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人 ,队列的主要目的是提供路由并保证消息的传递,如果发送消息时接收者不可用,...
  • zt15732621796
  • zt15732621796
  • 2016年08月30日 17:50
  • 828

MSMQ 微软消息队列服务

1) MSMQ概述 MSMQ 表示微软消息队列服务。MSMQ 可以工作在在线或者离线场景,并提供异步编程功能。如果客户端离线,MSMQ将会是最合适的方法,这是因为服务端不需要等待客户端读取数据并向服...
  • ZLHZHJ
  • ZLHZHJ
  • 2014年03月06日 21:04
  • 3903
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM+系列——实战演练MSMQ(消息队列)(二)
举报原因:
原因补充:

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