.Net下的MSMQ(微软消息队列)的同步异步调用

一、MSMQ简介

 MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式、松散连接的消息通讯应用程序的开发工具。消息队列

和电子邮件有着很多相似处,他们都包含多个属性,用于保存消息,消息类型中都指出发送者和接收者的地址;然而他们的用处却有着很大的

区别:消息队列的发送者和接收者是应用程序,而电子邮件的发送者和接收者通常是人。如同电子邮件一样,消息队列的发送和接收也不需要

发送者和接收者同时在场,可以存储在消息队列或是邮件服务器中。

二、消息队列的安装

 默认情况下安装操作系统是不安装消息队列的,你可以在控制面板中找到添加/删除程序,然后选择添加/删除Windows组件一项,然后选择应

用程序服务器,双击它进入详细资料中选择消息队列一项进行安装,如图:

.Net下的MSMQ(微软消息队列)的同步异步调用

.Net下的MSMQ(微软消息队列)的同步异步调用


.Net下的MSMQ(微软消息队列)的同步异步调用
三、消息队列类型

消息对列分为3类:
 
公共队列
 MachineNameQueueName
 能被别的机器所访问,如果你的多个项目中用到消息队列,那么你可以把队列定义为公共队列
 
专用队列
 MachineNamePrivate$QueueName
 只针对于本机的程序才可以调用的队列,有些情况下为了安全起见定义为私有队列。
日志队列
 MachineNameQueueNameJournal$
 

四、消息队列的创建

MessageQueue Mq=new MessageQueue(“.\private$\Mymq”);

通过Path属性引用消息队列的代码也十分简单:

MessageQueue Mq=new MessageQueue();

Mq.Path=”.\private$\Mymq”;

使用 Create 方法可以在计算机上创建队列:

System.Messaging.MessageQueue.Create(@".private$Mymq");

这里注意由于在C#中要记住用反斜杠将“”转义。

由于消息对列所放置的地方经常改变,所以建议消息队列路径不要写死,建议放在配置文件中。

五、消息的发送

消息的发送可以分为简单消息和复杂消息,简单消息类型就是常用的数据类型,例如整型、字符串等数据;复杂消息的数据类型通常对应于系

统中的复杂数据类型,例如结构,对象等等。

Mq.Send("Hello!");
在这里建议你可以事先定义一个对象类,然后发送这个对象类的实例对象,这样以后无论在增加什么发送信息,只需在对象类中增加
相应的属性即可。

六、消息的接收和阅读

(1)同步接收消息

  接收消息的代码很简单:

 Mq.Receive();
        Mq.Receive(TimeSpan timeout); //设定超时时间
 Mq.ReceiveById(ID);
        Mq.Peek(); 
 
 通过Receive方法接收消息同时永久性地从队列中删除消息;
 通过Peek方法从队列中取出消息而不从队列中移除该消息。
 如果知道消息的标识符(ID),还可以通过ReceiveById方法和PeekById方法完成相应的操作。

(2)异步接受消息
   
   利用委托机制:

 MessQueue.ReceiveCompleted +=new ReceiveCompletedEventHandler(mq_ReceiveCompleted);
 


(3)消息阅读

在应用程序能够阅读的消息和消息队列中的消息格式不同,应用程序发送出去的消息经过序列化以后才发送给了消息队列
而在接受端必须反序列化,利用下面的代码可以实现:

 public void mq_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e)
  {
   System.Messaging.Message m = MessQueue.EndReceive(e.AsyncResult);
   m.Formatter = new System.Messaging.XmlMessageFormatter(new string[]{"System.String,mscorlib"});
   Console.WriteLine("Message: " + (string)m.Body);
   MessQueue.BeginReceive() ;

  }

反序列化还有另一种写法:
 m.Formatter = new XmlMessageFormatter ( new Type [] { typeof (string) } );

七、由于消息队列的代码有些是固定不便的,所以把这些代码封装成一个类方便以后使用:

  1.Net下的MSMQ(微软消息队列)的同步异步调用using System;
  2.Net下的MSMQ(微软消息队列)的同步异步调用using System.Messaging;
  3.Net下的MSMQ(微软消息队列)的同步异步调用using System.Threading;

  5.Net下的MSMQ(微软消息队列)的同步异步调用
  6.Net下的MSMQ(微软消息队列)的同步异步调用namespace LoveStatusService
  7

UserObject的代码

  1.Net下的MSMQ(微软消息队列)的同步异步调用using System;
  2.Net下的MSMQ(微软消息队列)的同步异步调用
  3.Net下的MSMQ(微软消息队列)的同步异步调用namespace Goody9807
  4

另一个同事写的封装类

http://www.cnblogs.com/goody9807/archive/2007/05/18/546572.html