MSMQ的简单介绍

一、MSMQ简介

 

MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式、松散连接的消息通讯应用程序的开发工具。消息队列和电子邮件有着很多相似处,他们都包含多个属性,用于保存消息,消息类型中都指出发送者和接收者的地址;然而他们的用处却有着很大的区别:消息队列的发送者和接收者是应用程序,而电子邮件的发送者和接收者通常是人。如同电子邮件一样,消息队列的发送和接收也不需要,发送者和接收者同时在场,可以存储在消息队列或是邮件服务器中。

 

 

二、消息队列的安装

 

默认情况下安装操作系统是不安装消息队列的,你可以在控制面板中找到添加/删除程序,然后选择添加/删除Windows组件一项,然后选择应用程序服务器,双击它进入详细资料中选择消息队列一项进行安装,如图:

 

 

 

 

 

三、消息队列类型

 

消息对列分为3类:
 
公共队列

MachineName\QueueName

能被别的机器所访问,如果你的多个项目中用到消息队列,那么你可以把队列定义为公共队列
 
专用队列

MachineName\Private$\QueueName

只针对于本机的程序才可以调用的队列,有些情况下为了安全起见定义为私有队列。

 

日志队列

MachineName\QueueName\Journal$

 

 

四、消息队列的创建

 

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) } );

 

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

posted @ 2008-07-19 14:03  songzibin  阅读(1060)  评论(0编辑  收藏  举报