. Net环境下消息队列(MSMQ)对象的应用

关于消息对象( MSMQ )的一些基本概念可以从《 消息队列( Message Queue )简介及其使用 》查阅,这里归纳在 .Net 环境下应用消息队列( MSMQ )开发的一些基本对象和方法。

 

队列类型及其相应的路径格式:

Public:  [MachineName]/[QueueName]

Private:  [MachineName]/Private$/[QueueName]

Journal:  [MachineName]/[QueueName]/Journal$

Machine journal:  [MachineName]/Journal$

Machine dead-letter:  [MachineName]/DeadLetter$

Machine transactional dead-letter:  [MachineName]/XactDeadLetter$

The first portion of the path indicates a computer or domain name or uses a period (.) to indicate the current computer.

 

1. 创建消息队列

可以手动的方式通过 Windows 提供的工具创建,或者通过程序的方式创建:

if (MessageQueue .Exists (".//Private$//MSMQDemo"))

            queue = new MessageQueue (".//Private$//MSMQDemo");

else

            queue = MessageQueue .Create (".//Private$//MSMQDemo");

 

2. 发送消息

缺省情况下,消息序列化 XML 格式,也可设置为 MessageQueue 对象的 Formatter 属性为 BinaryMessageFormatter ,以二进制格式序列化。

设置消息序列化格式:

if (rdoXMLFormatter .Checked )

            queue .Formatter = new XmlMessageFormatter ();

else

            queue .Formatter = new BinaryMessageFormatter ();

 

发送简单的文本消息:

string strMessage = "Hello, I am Rickie.";

queue .Send (strMessage , "Simple text message");

 

消息队列可以传送简单的文本消息,也可以传送对象消息,但需要满足如下条件:

1 class 必须有一个无参数的公共构造函数, .Net 使用这个构造函数在接收端重建对象。

2 class 必须标示为 serializable (序列化)。

3 )所有的 class 属性必须可读写,因为 .Net 在重建对象时不能够恢复只读属性的属性值,因此只读属性不能够序列化。

 

发送对象消息( CustomerInfo class 需要满足上述条件):

CustomerInfo theCustomer = new CustomerInfo ("0001", "Rickie Lee", "[email protected]");

queue .Send (theCustomer , "Object message");

 

3. / 显示消息

当消息接受后,消息将从队列中删除。可以通过使用 MessageQueue.Peek 方法来检索消息队列中的第一个消息的复制,保留消息在队列中。不过,这样只能获取的相同的消息。更好的办法是通过 foreach 来读消息队列中的消息,但不删除队列中的消息。

foreach(System.Messaging.Message message in queue)

{

          txtResults.Text += message.Label + Environment.NewLine;

}

 

4. 接收消息

一般而言,可以通过 Receive 方法来读取队列中的消息,对于非事务性的队列,优先读取高优先级的消息。如果队列中有多个相同优先级的消息,则以先进先去的方式进行读取消息。对于事务性的队列,则完全以先进先去的方式进行读取消息,忽略消息的优先级。

System .Messaging .Message receivedMessage ;

receivedMessage = queue .Receive (TimeSpan .FromSeconds (5));

 

上面采用同步调用,并且一直等到队列中有可用消息或超时过期。

 

Demo 界面(不在提供DEMO 程序)

. Net环境下消息队列(MSMQ)对象的应用_第1张图片

 

其他相关事项:

  • 关于消息的加密、路由等等特性,需要有配置 Active Directory 的消息队列服务器。
  • 为了避免存放消息队列的计算机重新启动而丢失消息,可以通过设置消息对象的 Recoverable 属性为 true ,在消息传递过程中将消息保存到磁盘上来保证消息的传递,默认为 false
  • 消息发送方和消息接收方需采用相同的序列化格式,如 XML Binary
  • 建议每一个消息队列存放相同类型的消息对象,这样可以省掉获取消息对象后,进行类型判别的麻烦。  

5. 消息队列在分布式系统中的应用

消息队列 MSMQ 和数据库不一样,消息队列缺乏足够的错误检查能力,并且 MSMQ 由于需要束缚在 windows 平台,这些是 MSMQ 的不足之处。另外 Production 环境中,需要编写大量的代码来进行错误检测和响应。还有大量的死信队列、响应队列和日记队列可能部分在企业不同的计算机上,使得跟踪这些问题或进行诊断变得比较困难。

 

但是, MSMQ 作为组件内部连接比较有用。例如,你可以创建一个 XML Web Services 使用 MSMQ 来转发对另一个 Server 端组件的请求,这种设计巧妙回避了其他异步调用的方法,并且确保可扩展性和性能。

   

References:

1, Matthew MacDonald, Microsoft® .NET Distributed Applications: Integrating XML Web Services and .NET Remoting

2, Rickie, 消息队列( Message Queue)简介及其使用

你可能感兴趣的:(. Net环境下消息队列(MSMQ)对象的应用)