深入浅出消息队列MSMQ

        消息队列MSMQ,相信稍有开发经验的小伙伴都了解一些。开始讲解之前,我们先弄清楚一件事,为什么我们要使用MSMQ:

        您可能认为您能够通过一个简单的数据库表(一个应用程序往其中写入数据,另一个应用程序从中读取数据)来应用消息队列。消息队列平台更为稳定,因为它们通常拥有自己的安全机制、事务支持及其它功能。传输消息的路由功能是它的一个关键应用。MSMQ提供各种消息队列平台。

        总结一下MSMQ的优势是:高性能、跨平台和更好的安全机制、实物机制。同时,MSMQ这种消息中间件技术也是分布式开发的重要组成部分。

一、基本概念

        MSMQ全称是Microsoft Message Queue——微软消息队列。它是一种异步传输模式,可以在不同的应用之间实现相互通信,相互通信的应用可以分布在同一台机器上,也可以分布于相连的网络空间中的任一位置。

二、工作原理

        MSMQ的实现原理是:消息的发送者把自己想要发送的信息放入一个容器(Message),然后把它保存到一个系统公用空间的消息队列(Message Queue)中,本地或异地的消息接收程序再从该队列中取出发给它的消息进行处理。

        消息队列是一个公用存储空间,它可以存在于内存中或物理文件中,因此,消息以两种方式发送,即快递方式和可恢复模式。它们的区别是消息存储位置的不同,快递方式,为了消息的快速传递,所以把消息放置在内存中,而不放在物理磁盘上,以获得较高的处理能力;而可恢复模式在传送过程的每一步骤中,都把消息写入物理磁盘上,这样当保存消息队列的机器发生故障而重新启动后,可以把发送的消息恢复到故障发送之前的状态,以获得更好的消息恢复能力。消息队列可以放在发送方、接收方所在的机器上,也可以单独放置在另外一台机器上。另外,采用消息队列机制,发送方不必要担心接收方是否启动,是否发生故障等因素,只要消息成功发送出去,就可以认为处理完成,而实际上对方可能甚至未开机,或者实际消息传递到对方可能在第二天。MSMQ机制类似QQ消息传递机制。下图演示了MSMQ的实现原理。

MSMQ中主要有两个概念:

(1)一个是消息Message:Message是通信双方需要传递的消息,它可以是文本、图片、视频等。消息包含发送和接收者的标识,只有指定的用户才能取得消息。

(2)一个是队列Queue:用来保存消息的存储空间,MSMQ中主要包括以下几种队列类:

公共队列:在整个消息队列网络中复制,有可能由网络连接的所有站点访问。路径格式为:机器名称\队列名称
专用队列(或叫私有队列):不在整个网络中发布,它们仅在所驻留的本地计算机上可用,专用队列只能由知道队列的完整路径名称或标签的应用程序访问。路径格式为:机器名称\Private$\队列名称
日志队列:包含确认在给定“消息队列中发送的消息回执消息”。路径格式为:机器名称\队列名称\Journal$
响应队列:包含目标应用程序接收到消息时返回给发送应用程序的响应消息,包括机器日志队列、机器死信队列和机器事务死信队列。其中,机器信道死信队列对应的格式为:机器名称\XactDeadletter$。机器死信队列对应的格式为:机器名称\Deadletter$;机器日志队列对应的格式为:机器名称\Journal$;

三、MSMQ的安装和配置

        打开Control Panel-“Add/Remove Programs” – “Add/Remove Windows Components”步骤安装MSMQ。

       MSMQ可以安装为工作组模式或域模式。如果安装程序没有找到一台运行提供目录服务的消息队列的服务器,则只可以安装为工作组模式,此计算机上的“消息队列”只支持创建专用队列和创建与其他运行“消息队列”的计算机的直接连接。

        配置MSMQ:打开Computer Management – Message Queuing,在Private Queues下创建MSMQDemo队列

四、消息发送和消费实例 

1、消息发送

首先从发送数据开始,在发送数据时首先要创建我们的MQ,然后根据MQ的地址创建相应的队列,调用队列的send方法将数据信息发送到队列中,如下代码:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Linq.Expressions;  
using System.Messaging;  
using System.Runtime.CompilerServices;  
using System.Text;  
using System.Threading;  
using System.Xml;  
using System.Xml.Serialization;  
using System.Runtime.Serialization.Formatters.Binary;  
  
namespace MsMQTest  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            //declare the MQ Path  
            string ekQ= ".\\Private$\\EKTestQueue";  
  
            //create the MQ if the MQ is not exist  
            if (!MessageQueue.Exists(ekQ))  
                MessageQueue.Create(ekQ);  
  
            //create a new queue  
            var queue = new MessageQueue(ekQ);  
  
            for (int i = 0; i < 2; i++)  
            {  
                //create the model that want to send  
                Test test=new Test();  
                test.Name = "fdsfd";  
                test.Sex = "cvx";  
                //serialize the model  
                string str = Program.xmlSerial(test);  
                //send the model data to queue  
                queue.Send("Test" + str);  
                Console.WriteLine("Message sent {0} \n--------------", "Test" +str);  
            }  
  
            Console.Read();  
  
            // MessageQueue.Delete(ekQ);  
        }  
  
        public static string xmlSerial<T>(T serializeClass)  
        {  
            string xmlString = string.Empty;  
            XmlWriterSettings settings = new XmlWriterSettings();  
            XmlSerializer serializer = new XmlSerializer(typeof(T));  
            StringBuilder xmlStringBuilder = new StringBuilder();  
            using (XmlWriter writer = XmlWriter.Create(xmlStringBuilder))  
            {  
                serializer.Serialize(writer, serializeClass);  
                xmlString = xmlStringBuilder.ToString();  
            }  
  
            return xmlString;  
        }  
    }  
  
    public class Test  
    {  
        public string Name { get; set; }  
        public string Sex { get; set; }  
    }  
}  

运行结果:

MSMQ消息截图:

 2、消息接收

运行上面的代码后会把消息发送到相应的消息队列中,这样在消息的发送方和调用方之间就构建了一个相互松耦合的桥梁,它就是消息队列,接下来演示如何接收消息队列。

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Messaging;  
using System.Text;  
using System.Threading;  
namespace MsqueueReaderTest  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            string ekQ = ".\\Private$\\EKTestQueue";  
              
            using (var queue = new MessageQueue(ekQ))  
            {  
                queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });  
                var exist = false;  
                while (!MessageQueue.Exists(ekQ))  
                {  
                    Console.WriteLine("No existing queue");  
                          
                }  
                exist = true;  
                while (exist)  
                {  
                    var m = queue.Receive();  
                    Console.WriteLine("Message Received {0} \n--------------",(string)m.Body);  
                    // Thread.Sleep(500);  
                }  
            }  
              
        }  
    }  
}  

运行结果如下:

小结: 

        MQ是一种企业服务的消息中间节技术,这种技术常常伴随着企业服务总线相互使用,构成了企业分布式开发的一部分,如果考虑到消息的发送和传送之间是可以相互不联系的并且需要分布式架构,则可以考虑使用MQ做消息的中间价技术,MQ的功能已经足够开发使用。

参考文章:https://www.cnblogs.com/jx270/p/4943199.html

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MSMQ是微软的消息队列技术,它是一种企业服务的消息中间件技术,常与企业服务总线一起使用,是企业分布式开发的一部分。使用MQ作为消息中间件可以实现消息的发送和传递之间的解耦,适用于需要分布式架构的系统。 在MQ中,消息队列可以分为静态和动态两种类型。静态消息队列与网络相关联,分为公共队列和专用队列,公共队列是整个网络中所有站点都可以公开访问的,而专用队列只能由知道队列完整路径名或标签的应用程序访问。动态消息队列根据消息接收的操作不同,分为管理队列和响应队列,管理队列包含了整个消息线路中已经发送和接收的消息,而响应队列则用于目标程序接收和回应消息。 MQ的行为方面可以分为队列通信和消息处理两个大的方面。队列通信分为同步和异步两种类型,同步消息是指发送方在执行其他任务之前必须等待接收方的响应,而异步消息则不需要等待接收方的回应就可以继续其他操作。在消息队列交互方面,还有数据完整性、数据一致性、稳定性等类型的考虑,包括消息的优先级、脱机能力、事务性和安全性等。 使用MSMQ,开发者可以通过MessageQueue类对消息队列进行操作。在操作消息之前,需要创建一个存储消息的队列,并为MessageQueue指定消息队列的路径。主要使用的方法和属性包括队列管理和消息管理两类方法,其中队列管理方法用于创建和删除队列,消息管理方法分为同步和异步两种类型,根据实际需求确定使用的类型。主要使用的属性包括Path和Label,Path指定消息队列的地址,Label用于设置或获取队列的描述信息。 总之,MSMQ是微软的消息队列技术,可以实现消息的发送和传递之间的解耦,适用于企业分布式开发。它包括静态和动态消息队列,支持同步和异步消息通信,同时考虑数据完整性、数据一致性和稳定性等因素。开发者可以使用MessageQueue类对消息队列进行管理和操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MSMQ消息队列 用法](https://blog.csdn.net/baihuomeng2210/article/details/101087984)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MarcoPro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值