走近消息队列之——MSMQ(.net)

一、普通队列:

       string MQ_01 = ".\Private$\MQ_01";
            //不存在队列时创建队列
            if (!MessageQueue.Exists(MQ_01))
            {
                MessageQueue.Create(MQ_01);
            }
            MessageQueue queue = new MessageQueue(MQ_01);//获取队列映射
            queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });//告知读取信息采用的格式(使用该对象queue的映射,全部按这个格式读取信息)

            //发送信息
            //举个例子:依次发10个消息
            for (int i = 0; i < 10; i++)
            {
                Message msg = new Message();
                msg.Label = $"label_{i}";
                msg.Body = $"body_{i}";
                queue.Send(msg);
                Console.WriteLine($"消息发送成功-Label:{msg.Label},body:{msg.Body}");
            }

            //接收信息
            //全部接收
            while (queue.GetAllMessages().Count() > 0)
            {
                var receiveMsg = queue.Receive();
                Console.WriteLine($"消息读取成功-Label:{receiveMsg.Label},body:{receiveMsg.Body}");
            }

二、事务队列:

            string MQ_02 = ".\Private$\MQ_02";
            //不存在队列时创建队列
            if (!MessageQueue.Exists(MQ_02))
            {
                MessageQueue.Create(MQ_02, true);//开启了事务(1.电脑关机信息不丢失,2.发送&接收可以事务性操作);
            }
            MessageQueue queue = new MessageQueue(MQ_02);//获取队列映射
            queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });//告知读取信息采用的格式(使用该对象queue的映射,全部按这个格式读取信息)

            //事务发送信息(要么全部发送成功,要么全部发送失败)
            //举个例子:依次发10个消息
            if (queue.Transactional)
            {
                MessageQueueTransaction myTransaction = new MessageQueueTransaction();
                myTransaction.Begin();
                for (int i = 0; i < 10; i++)
                {
                    Message msg = new Message();
                    msg.Label = $"label_{i}";
                    msg.Body = $"body_{i}";
                    queue.Send(msg, myTransaction);
                    Console.WriteLine($"消息发送成功-Label:{msg.Label},body:{msg.Body}");
                }
                myTransaction.Commit();
            }

            //事务接收信息(要么全部接收成功,要么全部接收失败)
            //全部接收
            if (queue.Transactional)
            {
                MessageQueueTransaction myTransaction1 = new MessageQueueTransaction();
                myTransaction1.Begin();
                while (queue.GetAllMessages().Count()>0)
                {
                    var receiveMsg = queue.Receive(myTransaction1);
                    Console.WriteLine($"消息读取成功-Label:{receiveMsg.Label},body:{receiveMsg.Body}");
                }
                myTransaction1.Commit();
            }

三、远程队列:

  注意:不能跨服务器创建消息队列,只能服务器自行创建

    如果使用一下代码会报错:

       //不存在队列时创建队列
            if (!MessageQueue.Exists(MQ_02))
            {
                MessageQueue.Create(MQ_02, true);//开启了事务(1.电脑关机信息不丢失,2.发送&接收可以事务性操作);
            }
本地不能去判断服务器的队列是否存在,也不能创建服务器的队列。

正确方式:

  1.在服务器,我的电脑右键管理,后的消息队列里,右键创建一个专用队列:“MQ_03”

   2.设置队列属性

    

本地代码,发送消息到远端服务器的队列里去:

            string MQ_03 = @"FormatName:Direct=TCP:150.107.3.190private$MQ_03";
            MessageQueue queue = new MessageQueue(MQ_03);//获取队列映射
            queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });//告知读取信息采用的格式(使用该对象queue的映射,全部按这个格式读取信息)

            //发送信息
            //举个例子:依次发10个消息
            for (int i = 0; i < 10; i++)
            {
                Message msg = new Message();
                msg.Label = $"label_{i}";
                msg.Body = $"body_{i}";
                msg.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });// 选择xml的方式进行传送消息
                queue.Send(msg);
                Console.WriteLine($"消息发送成功-Label:{msg.Label},body:{msg.Body}");
            }

            //接收信息(接收会报错,原因:服务器的消息队列,只能服务器本地接收。)
            //所以,一般情况是,我们把消息发送到服务器队列,服务器里部署自己的程序去读取队列的信息后处理业务。
            //若要做到以下代码能执行,也就是跨服务器读取队列信息时,就要修改服务器注册表,允许服务器的队列可被远程读取信息。
            //全部接收
            //while (queue.GetAllMessages().Length > 0)
            //{
            //    var receiveMsg = queue.Receive();
            //    Console.WriteLine($"消息读取成功-Label:{receiveMsg.Label},body:{receiveMsg.Body}");
            //}
跨服务器读取队列信息时,就要修改服务器注册表,允许服务器的队列可被远程读取信息。可参考:
https://www.cnblogs.com/minily/p/7397746.html
原文地址:https://www.cnblogs.com/Bruke/p/10942586.html