MSMQ消息队列

news2024/11/28 22:51:06

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

MSMQ 原理

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

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

公共队列:在整个消息队列网络中复制,有可能由网络连接的所有站点访问。
路径格式为:
机器名称\队列名称

专用队列(或叫私有队列):不在整个网络中发布,它们仅在所驻留的本地计算机上可用,专用队列只能由知道队列的完整路径名称或标签的应用程序访问。
路径格式为:
机器名称\Private$\队列名称

日志队列:包含确认在给定“消息队列中发送的消息回执消息”。

路径格式为:机器名称\队列名称\Journal$

响应队列:包含目标应用程序接收到消息时返回给发送应用程序的响应消息,包括机器日志队列、机器死信队列和机器事务死信队列。其中,

机器信道死信队列对应的格式为:机器名称\XactDeadletterKaTeX parse error: Undefined control sequence: \Deadletter at position 20: …死信队列对应的格式为:机器名称\̲D̲e̲a̲d̲l̲e̲t̲t̲e̲r̲
机器日志队列对应的格式为:机器名称\Journal$;

优点:稳定、消息优先级、脱机能力以及安全性,有保障的消息传递和执行许多业务处理的可靠的防故障机制。

缺点:MSMQ不适合于Client需要Server端实时交互情况.大量请求时候,响应延迟.

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

《安装与启动服务》
在这里插入图片描述
我的电脑 >> 管理 >> 服务和应用程序 >> 消息队列 。出现消息队列则说明安装成功
在这里插入图片描述

MSMQ 客户端

using System;
using System.Messaging; // 需要添加System.Messaging引用

namespace MSMQClient
{
    class Program
    {
        static void Main(string[] args)
        {
            //私有队列  、专用队列
            if (MessageQueue.Exists(@".\Private$\AresWangMSMQ"))
            {
                // 创建消息队列对象
                using (MessageQueue mq = new MessageQueue(@".\Private$\AresWangMSMQ"))
                {
                    // 设置消息队列的格式化器
                    mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
                    foreach (Message msg in mq.GetAllMessages())
                    {
                        Console.WriteLine("Received Private Message is: {0}", msg.Body);
                    }
                    if(mq.CanRead)
                    {
                         //mq.Peek()   // 获得消息队列中第一条消息,但删除第一条记录
                   		 Message firstmsg = mq.Receive(); // 获得消息队列中第一条消息,且删除第一条记录,
                   		 
                   		 Console.WriteLine("Received The first Private Message is: {0}", firstmsg.Body);
                    }
                    
                }
            }
            Console.Read();
        }
    }
}


MSMQ 服务端

using System;
using System.Messaging;

namespace MSMQServer
{
    class Program
    {  
        static void Main(string[] args)
        {
            // 创建一个公共队列,公共队列只能创建在域环境里
            //if (!MessageQueue.Exists(@".\AresWangMSMQ")) // 判断此路径下是否已经有该队列
            //{
            //    using (MessageQueue mq = MessageQueue.Create(@".\AresWangMSMQ"))
            //    {
            //        mq.Label = "AresWangMSMQ"; // 设置队列标签
            //        Console.WriteLine("已经创建了一个公共队列");
            //        Console.WriteLine("路径为:{0}", mq.Path);
            //        Console.WriteLine("队列名字为:{0}", mq.QueueName);
            //        mq.Send("MSMQ Message", "Leaning Hard"); // 发送消息
            //    }
            //}

            //if (MessageQueue.Exists(@".\Private$\AresWangMSMQ"))
            //{
            //    // 删除消息队列
            //    MessageQueue.Delete(@".\Private$\AresWangMSMQ");
            //}
            // 创建一个私有消息队列
            if (!MessageQueue.Exists(@".\Private$\AresWangMSMQ"))
            {
                using (MessageQueue mq = MessageQueue.Create(@".\Private$\AresWangMSMQ"))
                {
                    mq.Label = "AresWangMSMQ"; 
                    Console.WriteLine("已经创建了一个私有队列");
                    Console.WriteLine("路径为:{0}", mq.Path);
                    Console.WriteLine("私有队列名字为:{0}", mq.QueueName);
                    mq.Send("MSMQ Private Message", "AresWangMSMQ"); // 发送消息
                }
            }

            // 遍历所有的公共消息队列
            //foreach (MessageQueue mq in MessageQueue.GetPublicQueues())
            //{
            //    mq.Send("Sending MSMQ public message" + DateTime.Now.ToLongDateString(), "Learning Hard");
            //    Console.WriteLine("Public Message is sent to {0}", mq.Path);
            //}
           
            if (MessageQueue.Exists(@".\Private$\AresWangMSMQ")) 
            {
                // 获得私有消息队列
                MessageQueue mq = new MessageQueue(@".\Private$\AresWangMSMQ");
                if(mq.CanWrite)
                {
               		 mq.Send("Sending MSMQ private message" + DateTime.Now.ToLongDateString(), "AresWangMSMQ");
                }
                Console.WriteLine("Private Message is sent to {0}", mq.Path);
            }

            Console.Read();
        }
    }
}

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1670612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【云原生】kubernetes核心组件

引言: Kubernetes 是为运行分布式集群而建立的,分布式系统的本质使得网络成为 Kubernetes 的核心和必要组成部分,了解 Kubernetes 网络模型可以使你能够正确运行、监控和排查应用程序故障。 一、Kubernetes的核心组件 1.1、Master组件 1.1.…

C# WinForm —— 18 NumericUpDown 介绍

1. 简介 数字显示框,通过向上、向下按钮来 增加/减小 显示的数值 2. 常用属性 属性解释(Name)控件ID,在代码里引用的时候会用到,一般以 numUD 开头Hexadecimal数值 up-down 控件的值是否应以十六进制显示Increment每单击一下按钮,增加或减…

0508GoodsContent的Maven项目

0508GoodsContent的Maven项目包-CSDN博客 数据库字段 页面需求

立聪堂助听器29周年暨第九届助听使者活动圆满落幕

5月10日对于立聪堂来说是个特别的日子,这家专注于听力健康领域的公司迎来了29周年。同时,立聪堂第九届助听使者代表及其家人也受邀参观立聪堂南京总部,共庆29周年。 易被忽视的老人听力健康 大数据显示,我国65岁以上老人&#x…

HubSpot海外获客系统的客户生命周期管理

潜在客户阶段:精准识别与吸引 在潜在客户阶段,HubSpot的强大数据分析能力使得企业能够精准地识别出目标市场的潜在客户。通过HubSpot的跟踪和分析工具,企业可以深入了解潜在客户的来源、浏览行为、兴趣偏好等关键信息,进而定制出…

MATLAB | 最新版MATLAB绘图速查表来啦!!

之前看大佬Pjer做的MATLAB速查表 http://home.ustc.edu.cn/~pjer1316/matlabplot/ 感觉非常的实用,最近几次MATLAB更新围绕画图方面也有很多新东西,于是就有了自己做一张最新版的速查表的想法,这张表长这样: 这张表的配色基本上…

为什么跨境电商大佬都在自养号测评?看完你就懂了!

在跨境电商的激烈竞争中,各大平台如亚马逊、拼多多Temu、shopee、Lazada、wish、速卖通、煤炉、敦煌、独立站、雅虎、eBay、TikTok、Newegg、Allegro、乐天、美客多、阿里国际、沃尔玛、Nike、OZON、Target以及Joom等,纷纷成为商家们竞相角逐市场份额的焦…

Adaptive leakthrough ANC自适应通透ANC调试快速上手3

1.在MDE中通过命令控制,让耳机进入到ANC tuning状态,在ancdesigner工具中连接成功; 2.前面Mision mode的方法中得到5各录音文件,生产相应的missin model; Adaptive leakthrough ANC自适应通透ANC调试快速上手 3.在file->configration中设置FB为Filter_PEQ手动调试,可以…

C++入门——引用(2)

前言 上一节我们开始学习了C,并且对C有了初步的了解,这一节我们继续学习C的基础,那么废话不多说,我们正式进入今天的学习 C中的引用 1.1引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名&#xff0…

限流算法(令牌桶漏桶计数器)

📝个人主页:五敷有你 🔥系列专栏:Spring⛺️稳中求进,晒太阳 业务重的三种情况:突发流量、恶意流量、业务本身需要 限流: 是为了保护自身系统和下游系统不被高并发流量冲垮,导致系统雪崩…

jQuery-2.鼠标焦点事件、节点操作、遍历元素、效果

鼠标事件 鼠标事件是当用户在文档上移动或单击鼠标时而产生的事件,常用的鼠标事件: 方法 描述 执行时机 click() 触发或将函数绑定到指定元素的click事件 单击鼠标时 mouseover() 触发或将函数绑定到指定元素的mouse over事件 鼠标移过时 mous…

体重秤蓝牙语音芯片方案-WT2605蓝牙音频ic在电子秤上的应用

在快节奏的现代生活中,健康成为了每个人关注的焦点。而体重作为健康指标之一,更是备受关注。如今,一款全新的智能体重秤蓝牙语音芯片方案正悄然改变着我们的健康管理方式,让健康触手可及。 性能: 1:蓝牙语…

.Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 发布到 Win7+

.Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 实测可以完整运行在 win7sp1/win10/win11. 如果用其他工具打包,还可以运行在mac/linux下, 传送门BlazorHybrid 发布为无依赖包方式 安装 WebView2Runtime 1.57 MB或136 MB 测试DEMO 发布为依赖包方式 安装 WebView2Runtime 1.…

渗透测试工具及插件第二期

一、OWASP Penetration Testing Kit 这个工具他集成了中间件,等版本信息,漏洞信息,url,标识头等信息,WAF/CDN识别,密匙等信息,多种信息的功能上集合的插件。 说明书:https://micros…

pwn(一)前置技能

以下是pwn中的题目(漏洞)类型: 关于pwn的学习: 一.什么是pwn?(二进制的漏洞) "Pwn"是一个俚语,起源于电子游戏社区,经常在英语中用作网络或电子游戏文化中的…

qt 5.15.x 安装android过程记录

1.经过好几天的qt for android 安装,发现存在很多坑 参考其他文章可以编译出APK文件。但是我发现(我的机器上)无法调试apk程序,不能调试那怎么行呢,看了很多文章都是运行出结果了就结束了。没有展示怎么调试程序。 很多文章都是建议安装JDK8…

Docker安装教程使用

一、Docker简介 什么是docker: docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上, 也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口什…

低代码在物品领用领域数字化转型的案例分析

办公用品管理数字化不仅代表了企业管理模式的革新,更是提升运营效率和成本控制的关键举措。通过数字化手段,企业能够实现采购、库存、领用等流程的自动化和智能化管理,大幅减少人工操作,提高处理速度,确保数据的准确性…

如何申请通配符SSL证书——值得收藏

申请通配符SSL证书的过程大致可以分为以下几个步骤: 1. 选择CA机构: 首先,您需要选择一个受信任的证书颁发机构(Certificate Authority,简称CA),如DigiCert、GlobalSign、或JoySSL。确保所选机构…

2023年数维杯国际大学生数学建模挑战赛B题棉花秸秆热解的催化反应解题全过程论文及程序

2023年数维杯国际大学生数学建模挑战赛 B题 棉花秸秆热解的催化反应 原题再现: 随着全球对可再生能源需求的不断增加,生物质能作为一种成熟的可再生能源得到了广泛的关注。棉秆作为一种农业废弃物,由于其富含纤维素、木质素等生物质成分&am…