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
  • 相关阅读:
    iOS textField placeholder 信息上浮
    iOS 用keypath设置一些属性
    iOS 自由拖动的滑块
    iOS 系统字体和导入新字体
    iOS 无法联网
    iOS 视频启动界面
    iOS 动画分享
    Xcode8 打包ios app,上传APPStore,发布流程 以及证书和配置文件遇到的坑
    mac电脑怎么打开world文档的目录
    ios添加设备真机测试,以及"Undefined symbols for architecture x86_64:''错误
  • 原文地址:https://www.cnblogs.com/Bruke/p/10942586.html
Copyright © 2011-2022 走看看