本帖透过 .NET 代码和 Windows 的图形界面,简单测试 Windows Server 2008 R2 中的 MSMQ (Microsoft Message Queue)。
------------------------------------------------------------------------------
消息队列 (也称为 MQ),让在不同时间运行的应用程序,可在异类网络和可能暂时脱机的系统之间通讯。我们撰写的应用程序,可向队列发送消息,或从队列读取消息。
消息队列提供了以下好处:
------------------------------------------------------------------------------
与 Windows Server 2008 R2 / Windows 7 一起发布的 Message Queuing 5.0 中,引入了下列的新功能:
------------------------------------------------------------------------------
安装消息队列
执行用户必须要有本地 Administrators 组中的成员身份,或等效身份。
在 Windows 7 上安装消息队列的步骤:
在 Windows Server 2008 R2 上安装消息队列的步骤:
圖 1 安装过程,以 Windows Server 2008 R2 为例
圖 2 安装过程,以 Windows Server 2008 R2 为例
不同版本的 Windows 支持不同的消息队列功能,下表列出了各版 Windows 7 和 Windows Server 2008 R2 所支持的功能:
功能 | Windows 7 简易版 |
Windows 7 家庭普通版 |
Windows 7 家庭高级版 |
Windows 7 旗舰版 |
Windows 7 专业版 |
Windows 7 企业版 |
Windows Server 2008 R2 所有版本 |
---|---|---|---|---|---|---|---|
Microsoft Message Queue (MSMQ) |
支持 |
支持 |
支持 |
支持 |
支持 |
支持 |
支持 |
消息队列管理控制台 |
支持 |
支持 |
支持 |
支持 |
支持 |
支持 |
支持 |
Microsoft Active Directory 域服务 |
不支持 |
不支持 |
不支持 |
支持 |
支持 |
支持 |
支持 |
MSMQ HTTP 支持/HTTP 支持 |
不支持 |
不支持 |
支持 |
支持 |
支持 |
支持 |
支持 |
MSMQ 触发器/消息队列触发器 |
支持 |
支持 |
支持 |
支持 |
支持 |
支持 |
支持 |
MSMQ DCOM 代理/消息队列 |
支持 |
支持 |
支持 |
支持 |
支持 |
支持 |
支持 |
多播支持/多播支持 |
支持 |
支持 |
支持 |
支持 |
支持 |
支持 |
支持 |
路由服务 |
不支持 |
不支持 |
不支持 |
不支持 |
不支持 |
不支持 |
支持 |
------------------------------------------------------------------------------
只允许队列中经过验证的消息
创建队列时,默认的权限是每个人都可以向该队列发送消息。若要获取更高的安全性,可更改队列的默认安全权限。也可以在创建队列时指定队列的属性。例如,可以指定只接受经过身份验证的消息。
以下为只允许在队列中,放置经过身份验证消息的步骤:
------------------------------------------------------------------------------
创建和使用队列
在 .NET 中,提供了方便我们操作 MSMQ 的 API - System.Messaging,而创建队列可用其中的 MessageQueue.Create。
Create方法有两个重载:
1、Message.Create(string path):创建非事务性队列。
2、Message.Create(string path, bool transactional):指定创建事务性或者非事务性队列。
在创建队列时先判断是否已经存在队列,还有就是权限问题。
创建各种类别的队列,是通过 path 属性不同的表现来实现:
1、公用队列:MachineName/QueueName
2、专用队列:MachineName/Private$/QueueName
3、日记队列:MachineName/QueueName/Journal$
4、计算机日记队列:MachineName/Journal$
5、计算机死信队列:MachineName/Deadletter$
6、计算机事务性死信队列:MachineName/XactDeadletter$
完整测试代码如下 (VS 2010 / ASP.NET 4.0 + Windows Server 2008 R2):
图 4 执行结果
------------------------------------------------------------------------------
事务性消息处理
在 MSMQ 中利用事务性处理,可以确保事务中的消息按照顺序传送,只传送一次,并且从目的队列成功地被检索。
若要发送或接收消息时加入事务,可以使用 MessageQueueTransaction 类以创建事务,并将其传递到 MessageQueue.Send 方法或 MessageQueue.Receive 方法 [3]。
启动了事务后的消息发送代码:
启动了事务后的消息读取代码:
------------------------------------------------------------------------------
参考文章:
[1] 使用消息组件
http://msdn.microsoft.com/zh-cn/library/be74twsx.aspx
[2] MessageQueue 成员
http://msdn.microsoft.com/zh-cn/library/system.messaging.messagequeue_members.aspx
[3] MessageQueueTransaction 类
http://msdn.microsoft.com/zh-cn/library/system.messaging.messagequeuetransaction.aspx
[4] 博客园里数十篇文章
http://www.cnblogs.com/beniao/archive/2008/06/26/1229934.html
http://www.cnblogs.com/beniao/archive/2008/06/28/1230311.html
http://www.cnblogs.com/frank_xl/archive/2009/02/09/1387125.html
http://www.cnblogs.com/Henllyee/archive/2009/02/28/1400582.html
http://www.cnblogs.com/jiekeng/articles/511303.html
http://www.cnblogs.com/neozhu/category/18481.html
http://www.cnblogs.com/rickie/category/13595.html
其他高手的文章...
------------------------------------------------------------------------------