如何应用.NET中的消息队列服务

开发者经常遇到需要异步执行操作的情况(即过程不等到操作完成就开始)。消息队列提供一个中心位置或池,您可以在其中放置或从中提取数据,从而满足了这一要求。一个应用程序能够把消息存放在队列中,然后继续自己的业务,另一个应用程序在运行时再提取这些数据。

队列名称的消息组件常常令开发者感到迷惑,因为他们习惯于处理邮件消息,但消息队列的消息部分却由数据组成。它为应用程序提供有保证的消息传输。

本文将说明如何利用Microsoft Message Queuing(MSMQ)和.NET Framework的消息队列。

为何使用消息队列

您可能认为您能够通过一个简单的数据库表(一个应用程序往其中写入数据,另一个应用程序从中读取数据)来应用消息队列。消息队列平台更为稳定,因为它们通常拥有自己的安全机制、事务支持及其它功能。传输消息的路由功能是它的一个关键应用。MSMQ提供各种消息队列平台。

MSMQ简介

MSMQ是Windows 2000、Windows XP、Windows Server 2003的一个组件,并将继续包含在Windows Vista和以后的Windows服务器中。即使目标接收应用程序没有运行,或运行发送或接收应用程序的计算机没有联网,协同合作的应用程序仍能利用MSMQ在彼此之间发送和接收消息。在到达目标队列之前,消息由MSMQ存储并转发。接收应用程序能够从队列中恢复数据。

MSMQ之类消息队列的主要特点在于它分离发送和接收应用程序,使其不必同时运行。这意味着一个应用程序能够把数据存放在队列中,而不用理会队列中的项目是否被传送到接收应用程序。

MSMQ是Windows的一个可选组件,只需通过Windows控制面板的添加或删除Windows组件向导就可进行安装。MSMQ有两种配置模式:域模式或工作组模式(只使用私有队列)。MSMQ安装完成后,立即就可以在.NET应用程序中运行。

MSMQ交互

开发基于消息的应用程序从队列开始。MSMQ包含四种队列类型:

  • 外发队列:消息发送到目的地之前,用它来临时存储消息。
  • 公共队列:在主动目录中公布。整个网络各种服务器上的应用程序能够通过主动目录找到并应用公共队列。
  • 私有队列:这些是本地服务器上的队列,对其它服务器无效(因此这些队列不在主动目录中公布。)
  • 系统队列:包含日记队列(由系统生成)、死队列和事务型死信队列。死消息无法传送。

System.Messaging命名空间执行MSMQ的编程操作。这个命名空间有两个主要的对象:

  • Message:队列发送或读取的实际消息或数据。
  • MessageQueue:接收/发送消息的MSMQ消息队列。

    MSMQ编程

    建立一个队列是应用MSMQ的第一步。您可以通过Windows计算机管理控制台中的消息队列选项完成这一操作,或者自己编程建立一个队列。

 

Message msg = null;
MessageQueuemq = null;

try 
{
	msg = new Message();
	msg.Priority = MessagePriority.Normal;
	if (!MessageQueue.Exists(@".\Private$\TechRepublic")) 
	{
		mq = MessageQueue.Create(@".\Private$\TechRepublic");
	}
	 else 
	{
		mq = new MessageQueue(@".\Private$\TechRepublic");
	}
	msg.Label = "Test Message";
	msg.Body = "This is only a test";
	mq.Send(msg);
	Console.WriteLine("Message sent.");
}
catch (System.Messaging.MessageQueueException ex) 
{
	Console.WriteLine("MSMQ Error: " + ex.ToString());
}
catch (Exception ex)
{
	Console.WriteLine("Error: " + ex.ToString());
} 
finally
{
	mq.Close();
}

  中的C#代码建立了一个新的私有MSMQ消息队列(如果不存在队列),并同时创建一条消息。

代码应用MessageQueue类的Exists方法来确定是否存在一个名为TechRepublic的私有队列。如存在,它用现有队列示例这个MessageQueue对象;否则,就建立一个新队列。

新的Message对象用来向队列发送一条消息。它的Label属性指定在MSMQ控制台中显示的消息标题,其主体包含存放在队列上的项目内容。在这种情况下,我只发送文本,但您能够使用任何类型的对象。MessageQueue类的Send方法向队列发送消息。

 

Dim mq As MessageQueue
Dim msg As Message

Try 
	msg = New Message
	msg.Priority = MessagePriority.Normal
	If Not (MessageQueue.Exists(".\Private$\TechRepublic2")) Then
		mq = MessageQueue.Create(".\Private$\TechRepublic2")
	Else
		mq = New MessageQueue(".\Private$\TechRepublic2")
	End If
	msg.Label = "Test Message"
	msg.Body = "This is only a test"
	mq.Send(msg)
	Console.WriteLine("Message sent.")
Catch ex As MessageQueueException
	Console.WriteLine("MSMQ Error: " + ex.ToString())
Catch ex As Exception
	Console.WriteLine("Error: " + ex.ToString())
Finally
	mq.Close()
End Try

中是对应的VB.NET代码。

下一步即从队列中读取消息。这是一个简单的过程,应用MessageQueue类的Receive方法即可。如果队列中存在消息,Receive方法就返回一个消息对象;否则,它等待一条消息出现(您可以设置一个时间期限)。从队列中恢复对象需要预先知道它的类型。

MessageQueue类的Formatter属性允许您轻松指定被恢复对象的类型。下面的简单例子仅使用文本,所以它应用System.String。在

 

Message msg = null;
MessageQueuemq = null;
try 
{
	mq = new MessageQueue(@".\Private$\TechRepublic");
	msg = mq.Receive(new TimeSpan(0, 0, 3));
	msg.Formatter = new XmlMessageFormatter(new String[] {"System.String,mscorlib"});
	mq.Receive();
	Console.WriteLine(msg.Label.ToString() + " -- " + msg.Body.ToString());
} 
catch (System.Messaging.MessageQueueException ex) 
{
	Console.WriteLine("MSMQ Error: " + ex.ToString());
}
catch (Exception ex) 
{
	Console.WriteLine("Error: " + ex.ToString());
} 
finally 
{
	mq.Close();
}

中,C#代码从测试队列中读取消息。

提交给Receive方法的TimeSpan对象指定异常出现时系统的等待时间。接下来设置这个例子中的Formatter方法,对象被转换成字符串读取前面存储的文本。Receive方法从队列中读取消息,它的值显示在控制台中。在try块的最后部分,队列关闭。

轻松应用消息

MSMQ组合Windows和.NET的System.Messaging命名空间,使您可以方便地在.NET应用程序中利用消息。消息提供一种在企业应用程序中异步发送并接收消息(数据)的强大工具。

转载于:https://www.cnblogs.com/sherrys/archive/2006/11/27/574503.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值