C# 【消息队列】MSMQ

一、MSMQ的安装

操作系统:Windows10

        使用MSMQ进行软件开发需要安装MSMQ,安装完后就该进入实际的开发阶段。具体的安装过程就是在控制面板里“添加/删除程序”下“添加/删除Windows组件”,完成添加就OK。安装完成后就可以通过交互界添加新的消息队列,详细如下图

点击”确定“后,如下图:

右键我的电脑-管理---服务和应用程序下  会看到 “消息队列”,然后如下图:

Win+R,执行servers.msc,查看MSMQ服务是否启动:

二、MSMQ的处理流程

        消息队列对整个框架的性能提升有了很大的进步,它包括创建消息、发送消息、接收消息、删除消息、异步消息处理。其中整体上还是比较相似的,在其中的一些过程中可以添加事务来保证操作的完整性。

        MSMQ消息队列中定义的消息由一个主体(body)和若干属性构成。消息的主体可以由文本,二进制构成,根据需要还可以被加密。在MSMQ中消息大小不能够超过4MB。

       

三、MSMQ简单应用

        在.NET中微软对MQ做了封装,把MQ有关的信息封装到了MessageQueue类中,在开发的时候可以直接引用该类,对队列中的消息做操作。

首先工程中添加引用:System.Messaging.dll

1、MSMQ的创建和发送
        在操作消息前首先要为消息指定存储的队列,所以在创建“消息”时首先要在服务器上创建一个“队列”,然后为MessageQueue指定消息队列的路径。

    class Program
    {
        static void Main(string[] args)
        {
            //定义 MQ 地址  
            string ekQ = ".\\Private$\\TestQueue";

            //如果不存在ekQ消息队列,则创建该消息队列  
            if (!MessageQueue.Exists(ekQ))
                MessageQueue.Create(ekQ);

            //创建消息队列对象
            var queue = new MessageQueue(ekQ);

            for (int i = 0; i < 2; i++)
            {
                //创建要发送的实体
                Test test = new Test();
                test.Name = "fdsfd";
                test.Sex = "cvx";
                //序列化实体
                string str = Program.xmlSerial(test);
                //发送消息到队列  
                queue.Send("Test" + str);
                Console.WriteLine("Message sent {0} \n--------------", "Test" + str);
            }
            Console.Read();

            // 删除消息队列
            // MessageQueue.Delete(ekQ);  
        }

        /// <summary>
        /// 序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="serializeClass"></param>
        /// <returns></returns>
        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;
        }
    }

    /// <summary>
    /// 消息实体
    /// </summary>
    public class Test
    {
        public string Name { get; set; }
        public string Sex { get; set; }
    }

对应生成的的结果如下:

运行上面的代码后MQ将会把消息发送到相应的消息队列中,这里采用的是专有队列所以会将消息发送到本地的队列中。这样在消息的发送方和调用方之间就构建了一个相互松耦合的桥梁,进入“计算机管理”中查看消息,如下图所示:

2、MSMQ的接收

namespace MsqueueReaderTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string ekQ = ".\\Private$\\TestQueue";

            if (MessageQueue.Exists(ekQ))
            {
                // 创建消息队列对象
                using (MessageQueue mq = new MessageQueue(ekQ))
                {
                    // 设置消息队列的格式化器
                    mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });//mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
                    foreach (Message msg in mq.GetAllMessages())
                    {
                        Console.WriteLine("Received Message is: {0} \n--------------", msg.Body);
                    }
                    // 获得消息队列中第一条可用消息
                    Message firstmsg = mq.Receive(); 
                    Console.WriteLine("Received The first Message is: {0} \n--------------", firstmsg.Body);
                }
            }
            Console.Read();
        }
    }
}

对应生成的的结果如下:

在上例中我们使用的同步Receive方法,而且该方法会将消息队列中的消息取出并删除,所以在操作完成后消息队列中的消息会为空,所以运行后的队列为下图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值