首页 > 代码库 > .Net消息队列的使用

.Net消息队列的使用

.Net使用消息队列,借助windows组件来存储要完成的一系列任务,不用程序使用同一个队列,方便不同程序之间的数据共享和协作……

以本人经验,这个在某个方面类似于session(当然还有很多方面不同),相同之处:session可以把信息存储在aspnet_state服务中,网站重新编译或者重新启动网站,session不会丢失(session超时是正常情况,这种情况除外)。

 

win7中安装消息队列组件,其他操作系统请百度搜索相关资料。

技术分享

如果服务没有自动启动,需要启动服务:

技术分享

 

 

先创建队列,再使用队列,队列中的消息,发送一个多一个,接收一个少一个,先进先出。

 

 

[csharp] view plain copy
 
 print?技术分享技术分享
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.UI;  
  6. using System.Web.UI.WebControls;  
  7. using System.Messaging;  
  8. //添加物理文件 System.Messaging 的引用  
  9. namespace testweb  
  10. {  
  11.     public partial class MSMQtest : System.Web.UI.Page  
  12.     {  
  13.         protected void Page_Load(object sender, EventArgs e)  
  14.         {  
  15.             //CreateNewQueue("MsgQueue");//创建一个消息队列  
  16.             //sendSimpleMsg();//每一个队列最好只发送和接收同一种格式的信息,不然不好转换格式。  
  17.             //receiveSimpleMsg();//  
  18.             //receiveSimpleMsg();  
  19.             //sendComplexMsg();  
  20.             //receiveComplexMsg();  
  21.             MsgModel m = receiveComplexMsg<MsgModel>();  
  22.             Response.Write(m.ToString());  
  23.               
  24.         }  
  25.         private void sendSimpleMsg()  
  26.         {  
  27.             //实例化MessageQueue,并指向现有的一个名称为VideoQueue队列  
  28.             MessageQueue MQ = new MessageQueue(@".\private$\MsgQueue");  
  29.             //MQ.Send("消息测试", "测试消息");  
  30.             System.Messaging.Message message = new System.Messaging.Message();  
  31.             message.Label = "消息lable";  
  32.             message.Body = "消息body";  
  33.             MQ.Send(message);  
  34.   
  35.             Response.Write("成功发送消息," + DateTime.Now + "<br/>");  
  36.         }  
  37.         private void receiveSimpleMsg()  
  38.         {  
  39.             MessageQueue MQ = new MessageQueue(@".\private$\MsgQueue");  
  40.             //调用MessageQueue的Receive方法接收消息  
  41.             if (MQ.GetAllMessages().Length > 0)  
  42.             {  
  43.                 System.Messaging.Message message = MQ.Receive(TimeSpan.FromSeconds(5));  
  44.                 if (message != null)  
  45.                 {  
  46.                     //message.Formatter = new System.Messaging.XmlMessageFormatter(new string[] { "Message.Bussiness.VideoPath,Message" });//消息类型转换  
  47.                     message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });  
  48.                     Response.Write(string.Format("接收消息成功,lable:{0},body:{1},{2}<br/>", message.Label, message.Body.ToString(), DateTime.Now));  
  49.                 }  
  50.             }  
  51.             else  
  52.             {  
  53.                 Response.Write("没有消息了!<br/>");  
  54.             }  
  55.         }  
  56.         private void sendComplexMsg()  
  57.         {  
  58.             //实例化MessageQueue,并指向现有的一个名称为VideoQueue队列  
  59.             MessageQueue MQ = new MessageQueue(@".\private$\MsgQueue");  
  60.             //MQ.Send("消息测试", "测试消息");  
  61.             System.Messaging.Message message = new System.Messaging.Message();  
  62.             message.Label = "复杂消息lable";  
  63.             message.Body = new MsgModel("1", "消息1");  
  64.             MQ.Send(message);  
  65.   
  66.             Response.Write("成功发送消息,"+DateTime.Now+"<br/>");  
  67.         }  
  68.         private void receiveComplexMsg()  
  69.         {  
  70.             MessageQueue MQ = new MessageQueue(@".\private$\MsgQueue");  
  71.             //调用MessageQueue的Receive方法接收消息  
  72.             if (MQ.GetAllMessages().Length > 0)  
  73.             {  
  74.                 System.Messaging.Message message = MQ.Receive(TimeSpan.FromSeconds(5));  
  75.                 if (message != null)  
  76.                 {  
  77.                     message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(MsgModel) });//消息类型转换  
  78.                     MsgModel msg = (MsgModel)message.Body;  
  79.                     Response.Write(string.Format("接收消息成功,lable:{0},body:{1},{2}<br/>", message.Label, msg, DateTime.Now));  
  80.                 }  
  81.             }  
  82.             else  
  83.             {  
  84.                 Response.Write("没有消息了!<br/>");  
  85.             }  
  86.         }  
  87.         private T receiveComplexMsg<T>()  
  88.         {  
  89.             MessageQueue MQ = new MessageQueue(@".\private$\MsgQueue");  
  90.             //调用MessageQueue的Receive方法接收消息  
  91.             if (MQ.GetAllMessages().Length > 0)  
  92.             {  
  93.                 System.Messaging.Message message = MQ.Receive(TimeSpan.FromSeconds(5));  
  94.                 if (message != null)  
  95.                 {  
  96.                     message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(T) });//消息类型转换  
  97.                     T msg = (T)message.Body;  
  98.                     return msg;  
  99.                 }  
  100.             }  
  101.   
  102.             return default(T);  
  103.         }  
  104.   
  105.         /// <summary>  
  106.         /// 创建消息队列  
  107.         /// </summary>  
  108.         /// <param name="name">消息队列名称</param>  
  109.         /// <returns></returns>  
  110.         public void CreateNewQueue(string name)  
  111.         {  
  112.             if (!System.Messaging.MessageQueue.Exists(".\\private$\\" + name))//检查是否已经存在同名的消息队列  
  113.             {  
  114.                   
  115.                 System.Messaging.MessageQueue mq = System.Messaging.MessageQueue.Create(".\\private$\\" + name);  
  116.                 mq.Label = "private$\\"+name;  
  117.                 Response.Write("创建成功!<br/>");  
  118.             }  
  119.             else  
  120.             {  
  121.                 //System.Messaging.MessageQueue.Delete(".\\private$\\" + name);//删除一个消息队列  
  122.                 Response.Write("已经存在<br/>");  
  123.             }  
  124.         }  
  125.   
  126.     }  
  127.     [Serializable]  
  128.     public class MsgModel  
  129.     {  
  130.         public string id { get; set; }  
  131.         public string Name { get; set; }  
  132.         public MsgModel() { }  
  133.         public MsgModel(string _id, string _Name)  
  134.         {  
  135.             id = _id;  
  136.             Name = _Name;  
  137.         }  
  138.         public override string ToString()  
  139.         {  
  140.             if (string.IsNullOrEmpty(id) || string.IsNullOrEmpty(Name)) return "";  
  141.             return string.Format("id--{0},Name--{1}",id,Name);  
  142.         }  
  143.     }  
  144. }  

.Net消息队列的使用