zoukankan      html  css  js  c++  java
  • 走近消息队列之——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
  • 相关阅读:
    [LeetCode] 1131. Maximum of Absolute Value Expression 绝对值表达式的最大值
    [LeetCode] 1130. Minimum Cost Tree From Leaf Values 叶值的最小代价生成树
    [LeetCode] 1129. Shortest Path with Alternating Colors 颜色交替的最短路径
    [LeetCode] 1128. Number of Equivalent Domino Pairs 等价多米诺骨牌对的数量
    [LeetCode] 1125. Smallest Sufficient Team 最小的必要团队
    [LeetCode] 1124. Longest Well-Performing Interval 表现良好的最长时间段
    [LeetCode] 1122. Relative Sort Array 数组的相对排序
    Gitalk 自动初始化评论
    [LeetCode] 1111. Maximum Nesting Depth of Two Valid Parentheses Strings 有效括号的嵌套深度
    [LeetCode] 1110. Delete Nodes And Return Forest 删点成林
  • 原文地址:https://www.cnblogs.com/Bruke/p/10942586.html
Copyright © 2011-2022 走看看