MSMQ学习笔记

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

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

二、MSMQ的使用:

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

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             else

16             {

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在具体项目中的应用还是比较期待的,希望有朝一日能在真实项目中用上,这才是重点。

 

 

你可能感兴趣的:(学习笔记)