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