首页 > 代码库 > MSMQ学习笔记

MSMQ学习笔记

这几天学习了一下MSMQ,虽然不能说非常深入的了解其机制与实际用法(具体项目的实现),但也要给自己的学习做个总结。学习心得如下:

一、MSMQ即微软消息队列。用于程序之间的异步消息通信,主要的机制就是在某种情况将消息以队列的形式存于公共的空间,又在特定条件下进行相应的处理。

二、MSMQ的使用:

  1、安装系统消息队列。【控制面板】--【卸载程序】--【关闭/打开windows功能】--添加MSMQ功能。如下图所示

技术分享

  2、MessageQueue在System.Messaging命名空间下的。能够清楚的知道MessageQueue的内部方法和属性就可以数量的使用Msmq了。先列举几个比较常用的方法:

a、MessageQueue的类方法:

MessageQueue.Create(string path)---新建路径为path的消息队列(非事务型)

MessageQueue.Create(string path,bool transactional)----新建路径为path的消息队列(是否为事务型由transactional决定)

MessageQueue.Exists(string path)---判断是否已经存在路径为path的消息队列

MessageQueue.Delete(string path)--删除路径为path的消息队列

b、MessageQueue中的实例方法:

---BeginPeek(); 异步获取队列中的第一条消息,但不删除

---Peek(); 获取队列中的第一条消息,但不删除

---BeginReceive();异步获取队列中的第一条消息,同时删除

---Receive();获取队列中的第一条消息,同时删除

---Send(object obj);向队列中添加消息,object一般指定为Message对象

---GetAllMessages();获取队列中的所有消息,同时删除

---Purge(); 清空队列

---Formatter属性-----有两种形式,一种是二进制的形式(BinaryMessageFormatter),另一种是Xml形式(XmlMessageFormatter)

三、使用事例的部分代码:

1、创建

 1  MessageQueue messageQueue = null; 2         string path = @".\private$\Message\"; 3         /// <summary> 4         /// 打开对应的Msmq 5         /// </summary> 6         /// <param name="path">msmq路径</param> 7         /// <param name="transactional">是否为事务</param> 8         public void OpenMq(string path,bool transactional) 9         {10            11             if (MessageQueue.Exists(path))12             {13                 messageQueue = new MessageQueue(path);//注意已经存在该路径的msmq,其事务性是不可修改的14             }15             else16             {17                 messageQueue = MessageQueue.Create(path,transactional);18             }19 20         }

2、发送消息至队列

         /// <summary>        /// 二进制进队        /// </summary>        /// <param name="entity">可序列化对象</param>        public void SendBinary(Entity entity)        {            messageQueue.Send(new Message(entity, new BinaryMessageFormatter()));        }        /// <summary>        /// xml进队        /// </summary>        /// <param name="o"></param>        public void SendXml(object o)        {            messageQueue.Send(new Message(o, new XmlMessageFormatter()));        }        /// <summary>        /// 事务进队        /// </summary>        /// <param name="entity">可序列化对象</param>        /// <param name="ent">可序列化对象</param>        /// <param name="msg"></param>        /// <param name="flag">true为xml,false为binary</param>        public void XmlSendWithTrans(Entity entity, Ent ent, string msg, bool flag)        {            if (flag)                mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(Entity), typeof(Ent), typeof(string) });            else            {                messageQueue.Formatter = new BinaryMessageFormatter();            }            if (messageQueue.Transactional)            {                MessageQueueTransaction mqt = new MessageQueueTransaction();                mqt.Begin();                messageQueue.Send(new Message(entity), mqt);                messageQueue.Send(new Message(ent), mqt);                messageQueue.Send(new Message(msg), mqt);                mqt.Commit();            }        }

 

3、读取消息(使用Receive,读后删除)

1)非事务同步读取

 1        /// <summary> 2        /// 读取消息并删除 3        /// </summary> 4        /// <returns></returns> 5         public Message Receive() 6         { 7             messageQueue.Formatter = new BinaryMessageFormatter(); 8             try 9             {10                 return messageQueue.Receive(new TimeSpan(0, 0, 1));11             }12             catch (Exception ex)13             {14                 throw;15               // return new Message(ex.Message);16             }17         }

2)异步的读取(略)

至于其它方法都是差不多的,也不做代码说明了。主要是Message类中的Body属性是对象的信息承载体。

 

最后:关于MSMQ在具体项目中的应用还是比较期待的,希望有朝一日能在真实项目中用上,这才是重点。

 

 

MSMQ学习笔记