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

 

Top
收藏
关注
评论
原文地址:https://www.cnblogs.com/Joy-et/p/4212286.html