zoukankan      html  css  js  c++  java
  • Net消息队列的使用

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

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


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

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




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


    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 { getset; }  
    131.         public string Name { getset; }  
    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. }  
  • 相关阅读:
    免登陆 安全密钥验证
    第五节
    selinux
    scp
    Linux网卡绑定
    HDFS
    搭建软件仓库
    命名空间“System.Web”中不存在类型或命名空间名称“Optimization”(是否缺少程序集引用?)
    delphi利用指针,结构或component存储数据表数据
    Delphi中的ObjectList简单用法一则
  • 原文地址:https://www.cnblogs.com/dullbaby/p/5016287.html
Copyright © 2011-2022 走看看