关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

C#队列:MSMQ入门

发布时间:2020-03-24 00:00:00

       一、引言

    MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中,本地或者异地的消息接收程序再从该队列中取出发给它的消息进行处理。

    消息Message是由通信的双方所需要传递的信息。

    队列的类型主要包括以下几种:

    “公共队列”在整个“消息队列”网络中复制,并且有可能由网络连接的所有站点访问。

    “专用队列”不在整个网络中发布,相反,它们仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。

    “管理队列”包含确认在给定“消息队列”网络中发送的消息回执的消息。指定希望 MessageQueue 组件使用的管理队列(如果有的话)。

    “响应队列”包含目标应用程序接收到消息时返回给发送应用程序的响应消息。指定希望 MessageQueue 组件使用的响应队列(如果有的话)。

    优点:稳定、消息优先级、脱机能力以及安全性,有保障的消息传递和执行许多业务处理的可靠的防故障机制。

    缺点:MSMQ不适合于Client需要Server端实时交互情况;大量请求的时候响应延迟。

    二、安装

    在运行中输入appwiz.cpl->打开或关闭 Windows 功能->Microsoft Message Queue (MSMQ) 服务器。

 

    安装成功后,在运行中输入compmgmt.msc->服务和应用程序->消息队列。

    右键消息队列->属性,可更改默认存储路径等。

    三、示例演示

    class Program
    {static void Main(string[] args)
        {#region MSMQ入门一//创建消息队列,默认存储路径:C:\WINDOWS\system32\msmq\storageif (MessageQueue.Exists(@".\Private$\HelloMSMQ"))
                MessageQueue.Delete(@".\Private$\HelloMSMQ");   //删除消息队列HelloMSMQif (MessageQueue.Exists(@".\Private$\WorldMSMQ"))
                MessageQueue.Delete(@".\Private$\WorldMSMQ");   //删除消息队列WorldMSMQMessageQueue mqHello = MessageQueue.Create(@".\Private$\HelloMSMQ");
            MessageQueue mqWorld = MessageQueue.Create(@".\Private$\WorldMSMQ");//发送消息mqHello.Send("Hi World,I am Hello.", "mqHello1");
            mqHello.Send("Are you free?", "mqHello2");
            mqHello.Send("Hi Hello,I am World.", "mqWorld1");
            mqHello.Send("I guess I'll be free.", "mqWorld2");//返回本机所有私有队列的消息foreach (MessageQueue item in MessageQueue.GetPrivateQueuesByMachine("cx168"))
            {
                item.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
                Message[] messages = item.GetAllMessages();foreach (Message message in messages)
                {
                    Console.WriteLine($"Label: {message.Label} Body: {message.Body}");
                }
            }//返回指定队列的消息if (MessageQueue.Exists(@".\Private$\HelloMSMQ"))
            {using (MessageQueue theOne = new MessageQueue(@".\Private$\HelloMSMQ"))
                {
                    Console.WriteLine();//设置消息队列格式化器theOne.Formatter = new XmlMessageFormatter(new string[] { "System.String" });//接受但不删除消息Message msg = mqHello.Peek();
                    Console.WriteLine($"Label: {msg.Label} Body: {msg.Body}");//接受并删除消息msg = mqHello.Receive();
                    Console.WriteLine($"Label: {msg.Label} Body: {msg.Body}");
                    msg = mqHello.Peek();
                    Console.WriteLine($"Label: {msg.Label} Body: {msg.Body}");//删除所有消息                    mqHello.Purge();
                    Console.WriteLine($"mqHello count: {mqHello.GetAllMessages().Count()}");
                }
            }

            Console.Read();#endregion}
    }

    运行结果如下:

 

    参考自:

    https://www.cnblogs.com/tenghoo/archive/2009/11/05/1596456.html


/template/Home/Zkeys/PC/Static