欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#队列学习笔记:MSMQ入门一

程序员文章站 2023-02-18 12:25:16
一、引言 MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Messa ......

    一、引言

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

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

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

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

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

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

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

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

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

    二、安装

    在运行中输入appwiz.cpl->打开或关闭 windows 功能->microsoft message queue (msmq) 服务器。

C#队列学习笔记:MSMQ入门一 

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

C#队列学习笔记:MSMQ入门一

    三、示例演示

    class program
    {
        static void main(string[] args)
        {
            #region msmq入门一
            //创建消息队列,默认存储路径:c:\windows\system32\msmq\storage
            if (messagequeue.exists(@".\private$\hellomsmq"))
                messagequeue.delete(@".\private$\hellomsmq");   //删除消息队列hellomsmq
            if (messagequeue.exists(@".\private$\worldmsmq"))
                messagequeue.delete(@".\private$\worldmsmq");   //删除消息队列worldmsmq

            messagequeue 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
        }
    }

    运行结果如下:

C#队列学习笔记:MSMQ入门一

 

    参考自: