当前位置: 首页 > news >正文

深入浅出消息队列MSMQ

        消息队列MSMQ,相信稍有开发经验的小伙伴都了解一些。开始讲解之前,我们先弄清楚一件事,为什么我们要使用MSMQ:

        您可能认为您能够通过一个简单的数据库表(一个应用程序往其中写入数据,另一个应用程序从中读取数据)来应用消息队列。消息队列平台更为稳定,因为它们通常拥有自己的安全机制、事务支持及其它功能。传输消息的路由功能是它的一个关键应用。MSMQ提供各种消息队列平台。

        总结一下MSMQ的优势是:高性能、跨平台和更好的安全机制、实物机制。同时,MSMQ这种消息中间件技术也是分布式开发的重要组成部分。

一、基本概念

        MSMQ全称是Microsoft Message Queue——微软消息队列。它是一种异步传输模式,可以在不同的应用之间实现相互通信,相互通信的应用可以分布在同一台机器上,也可以分布于相连的网络空间中的任一位置。

二、工作原理

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

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

MSMQ中主要有两个概念:

(1)一个是消息Message:Message是通信双方需要传递的消息,它可以是文本、图片、视频等。消息包含发送和接收者的标识,只有指定的用户才能取得消息。

(2)一个是队列Queue:用来保存消息的存储空间,MSMQ中主要包括以下几种队列类:

公共队列:在整个消息队列网络中复制,有可能由网络连接的所有站点访问。路径格式为:机器名称\队列名称
专用队列(或叫私有队列):不在整个网络中发布,它们仅在所驻留的本地计算机上可用,专用队列只能由知道队列的完整路径名称或标签的应用程序访问。路径格式为:机器名称\Private$\队列名称
日志队列:包含确认在给定“消息队列中发送的消息回执消息”。路径格式为:机器名称\队列名称\Journal$
响应队列:包含目标应用程序接收到消息时返回给发送应用程序的响应消息,包括机器日志队列、机器死信队列和机器事务死信队列。其中,机器信道死信队列对应的格式为:机器名称\XactDeadletter$。机器死信队列对应的格式为:机器名称\Deadletter$;机器日志队列对应的格式为:机器名称\Journal$;

三、MSMQ的安装和配置

        打开Control Panel-“Add/Remove Programs” – “Add/Remove Windows Components”步骤安装MSMQ。

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

        配置MSMQ:打开Computer Management – Message Queuing,在Private Queues下创建MSMQDemo队列

四、消息发送和消费实例 

1、消息发送

首先从发送数据开始,在发送数据时首先要创建我们的MQ,然后根据MQ的地址创建相应的队列,调用队列的send方法将数据信息发送到队列中,如下代码:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Linq.Expressions;  
using System.Messaging;  
using System.Runtime.CompilerServices;  
using System.Text;  
using System.Threading;  
using System.Xml;  
using System.Xml.Serialization;  
using System.Runtime.Serialization.Formatters.Binary;  namespace MsMQTest  
{  class Program  {  static void Main(string[] args)  {  //declare the MQ Path  string ekQ= ".\\Private$\\EKTestQueue";  //create the MQ if the MQ is not exist  if (!MessageQueue.Exists(ekQ))  MessageQueue.Create(ekQ);  //create a new queue  var queue = new MessageQueue(ekQ);  for (int i = 0; i < 2; i++)  {  //create the model that want to send  Test test=new Test();  test.Name = "fdsfd";  test.Sex = "cvx";  //serialize the model  string str = Program.xmlSerial(test);  //send the model data to queue  queue.Send("Test" + str);  Console.WriteLine("Message sent {0} \n--------------", "Test" +str);  }  Console.Read();  // MessageQueue.Delete(ekQ);  }  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;  }  }  public class Test  {  public string Name { get; set; }  public string Sex { get; set; }  }  
}  

运行结果:

MSMQ消息截图:

 2、消息接收

运行上面的代码后会把消息发送到相应的消息队列中,这样在消息的发送方和调用方之间就构建了一个相互松耦合的桥梁,它就是消息队列,接下来演示如何接收消息队列。

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Messaging;  
using System.Text;  
using System.Threading;  
namespace MsqueueReaderTest  
{  class Program  {  static void Main(string[] args)  {  string ekQ = ".\\Private$\\EKTestQueue";  using (var queue = new MessageQueue(ekQ))  {  queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });  var exist = false;  while (!MessageQueue.Exists(ekQ))  {  Console.WriteLine("No existing queue");  }  exist = true;  while (exist)  {  var m = queue.Receive();  Console.WriteLine("Message Received {0} \n--------------",(string)m.Body);  // Thread.Sleep(500);  }  }  }  }  
}  

运行结果如下:

小结: 

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

参考文章:https://www.cnblogs.com/jx270/p/4943199.html

相关文章:

深入浅出消息队列MSMQ

消息队列MSMQ&#xff0c;相信稍有开发经验的小伙伴都了解一些。开始讲解之前&#xff0c;我们先弄清楚一件事&#xff0c;为什么我们要使用MSMQ&#xff1a; 您可能认为您能够通过一个简单的数据库表(一个应用程序往其中写入数据&#xff0c;另一个应用程序从中读取数据)来应用…...

Maven多模块开发

POM主要功能 maven学习教程很多&#xff0c;就不在赘述可以参考以下网站&#xff0c;这里只说明maven实际运用。 https://blog.csdn.net/xwh3165037789/article/details/121545762 菜鸟教程 Maven POM POM是在使用Maven构建项目最重要的部分&#xff0c; POM 中所有信息位于&l…...

QT之OpenGL帧缓冲

QT之OpenGL帧缓冲1. 概述1.1 帧缓冲的创建与删除1.2 帧缓冲的数据来源1.2.1 数据源与帧缓冲的关系1.2.2 纹理Attachment1.2.3 渲染缓冲对象Attachment1.2.4 两者的区别1.2.5 关于两者的使用场景2. Demo3. 后期处理4. 参考1. 概述 OpenGL管线的最终渲染目的地被称作帧缓冲(fram…...

$ 6 :选择、循环

if-else语句 #include <stdio.h> //判断输入值是否大于0 int main() {int i;while (scanf("%d",&i)){if (i > 0)//不要在括号后加分号{printf("i is bigger than O\n");}else {printf("i is not bigger than O\n");}}return O; } …...

【项目设计】高并发内存池 (四)[pagecache实现]

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…...

玩转qsort——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容还是我们的深度剖析指针呀&#xff0c;上篇博客我们学习了回调函数这个知识点&#xff0c;但是没有写完&#xff0c;因为&#xff1a;小雅兰觉得qsort值得单独写出来&#xff01;&#xff01;&#xff01;好啦&#xff0c;就…...

【干货】又是一年跳槽季!Nginx 10道核心面试题及解析

Nginx是一款轻量级的高性能Web服务器和反向代理服务器&#xff0c;由俄罗斯的Igor Sysoev开发。它具有占用资源少、高并发、稳定性高等优点&#xff0c;被广泛应用于互联网领域。在Nginx的面试过程中&#xff0c;面试官通常会提出一些核心问题&#xff0c;本文将介绍一些常见的…...

【线程安全的HashMap有哪些,CurrentHashMap底层是怎么实现线程安全的】

在 Java 中&#xff0c;线程安全的 HashMap 通常有以下几种实现&#xff1a; Collections.synchronizedMap 方法&#xff1a;该方法可以将 HashMap 转换为线程安全的 Map。 Hashtable 类&#xff1a;Hashtable 是一种线程安全的集合类&#xff0c;它与 HashMap 类似&#xff0…...

C语言-结构体【详解】

一、 结构体的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量结构的每个成员可以是不同类型的变量 &#xff08;1&#xff09;结构体的声明 写法一&#xff1a; 注&#xff1a; 括号后边的分号不能忘结构体末尾可以不创建变量&#xff0c;在主函数中再创建 struc…...

浏览器输入url到页面渲染完成经历了哪些步骤

一、URL解析 这一步比较容易理解&#xff0c;在浏览器地址栏输入url后&#xff0c;浏览器会判断这个url的合法性 &#xff0c;以及是否有可用缓存&#xff0c;如果判断是 url 则进行域名解析&#xff0c;如果不是 url &#xff0c;则直接使用搜索引擎搜索 二、域名解析 输入…...

大数据技术之Hadoop(Yarn)

第1章Yarn资源调度器思考&#xff1a;1&#xff09;如何管理集群资源&#xff1f;2&#xff09;如何给任务合理分配资源&#xff1f;Yarn是一个资源调度平台&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&#xff0c;而MapReduce等…...

5.建造者模式

目录 简介 四个角色 应用场景 实现步骤 和工厂模式的区别 简介 建造者模式也叫生成器模式&#xff0c;是一种对象构建模式&#xff1b;它可以把复杂对象的建造过程抽象出来(抽象类别)&#xff0c;使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象&#xff1b;…...

数据库基础-数据库基本概念(1-1)

你好&#xff0c;欢迎来到数据库基础系列专栏&#xff0c;欢迎留言互动哦~ 目录一、数据库基础1. 数据库基本概念1.1 数据库1.2 什么是数据库管理软件1.3 表1.4 行1.5 列和数据类型1.6 主键1.7 什么是 SQL一、数据库基础 1. 数据库基本概念 1.1 数据库 数据库是一个以某种有…...

学习笔记-架构的演进之服务容错策略-服务发现-3月day01

文章目录前言服务容错容错策略附前言 “容错性设计”&#xff08;Design for Failure&#xff09;是微服务的一个核心原则。 使用微服务架构&#xff0c;拆分出的服务越来越多&#xff0c;也逐渐导致以下问题&#xff1a; 某一个服务的崩溃&#xff0c;会导致所有用到这个服务…...

采编式AIGC视频生产流程编排实践

作者 | 百度人工智能创作团队 导读 本文从业务出发&#xff0c;系统介绍了采编式 TTV的实现逻辑和实现路径。结合业务拆解&#xff0c;实现了一个轻量级服务编排引擎&#xff0c;有效实现业务诉求、高效支持业务扩展。 全文6451字&#xff0c;预计阅读时间17分钟。 01 背景 近…...

Leetcode23. 合并k个升序链表

一、题目描述&#xff1a; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]]输出&#xff1a;[1,1,2,3,4,4,5,6]解释&#…...

从用户出发,互联网产品策划方法论

【一】从用户到需求 产品经理需要具备两个非常重要的技能,一个叫策划,一个叫感知用户。 我们在分析问题的时候往往会说“这么做,我认为用户会怎么怎么样”、“用户会认为这样很不爽”,当我们这样说时,很有可能是把自己当成了用户,用某些特定的情感或记忆代表了用户。 当我…...

STM32 E18-D80NK红外检测

本文代码使用 HAL 库。 文章目录前言一、E18-D80NK 红外传感器&#xff1a;1. E18-D80NK 的介绍2. 电器特性二、红外检测小实验代码讲解三、实验现象总结前言 这篇文章介绍 如何使用 STM32 控制 E18-D80NK 进行红外检测。 一、E18-D80NK 红外传感器&#xff1a; 1. E18-D80N…...

Linux常用命令--进程和计划任务管理

一、程序和进程的关系 1、程序 ①保存在硬盘、光盘等介质中的可执行代码和数据 ②静态保存的代码 2、进程 ①在cpu及内存中运行及进程代码 ②动态执行的代码 ③父&#xff08;fork&#xff09;、子进程&#xff0c;每个程序可以创建一个或多个进程 父进程和子进程的区别&am…...

Unity TextMeshPro

Unity TextMeshPro 简介 TextMeshPro(也简称为TMP)号称是Unity的终极文本解决方案,它是Unity 的 UI 文本和旧版文本网格体的完美替代品。 功能强大且易于使用,使用高级文本渲染技术以及一组自定义着色器;提供实质性的视觉质量改进,同时在文本样式和纹理方面为用户提供令人…...

若依框架菜单管理实战:手把手教你为列表页添加详情页(Vue+Element UI)

若依框架菜单管理实战&#xff1a;手把手教你为列表页添加详情页&#xff08;VueElement UI&#xff09; 在后台管理系统开发中&#xff0c;列表页与详情页的联动是基础但关键的功能需求。许多开发者在使用若依框架的代码生成器快速搭建项目后&#xff0c;常常面临一个典型问题…...

锂电池热失控防护:从封装技术到系统级安全设计

1. 从三星Note 7到航天器&#xff1a;锂电池安全问题的根源与演进2016年&#xff0c;三星Galaxy Note 7的“燃损门”事件&#xff0c;将锂电池安全问题以一种极其戏剧化且代价高昂的方式&#xff0c;推到了全球消费者和整个电子产业的聚光灯下。官方调查最终指向了电池设计缺陷…...

从GPS周内秒到日常时间:原理、转换与编程实践

1. GPS时间系统的基本概念 第一次接触GPS时间数据时&#xff0c;我也被"周内秒"这个概念搞懵了。这和我们平时用的年月日时分秒完全不同&#xff0c;更像是一种程序员喜欢的计数方式。GPS时间系统&#xff08;GPST&#xff09;本质上是个超级精准的原子钟&#xff0c…...

应用安全从被动到主动:企业如何提升弹性与可靠性,降低安全债务?

ZDNET核心观点应用安全需董事会层面问责&#xff0c;企业文化影响“设计即安全”工作&#xff0c;运营模式将预防转化为行动。企业聚焦软件策略改变网络安全结果&#xff0c;挑战是在开发周期早期融入安全措施&#xff0c;构建捕捉漏洞和隐患的工具技术。本文将从被动到主动的转…...

半导体与EDA公司成长路径:从300万到5000万营收的实战指南

1. 从初创到巨头&#xff1a;一场关于半导体与EDA公司成长路径的深度对话如果你正在半导体、EDA&#xff08;电子设计自动化&#xff09;或者更广泛的硬科技领域创业&#xff0c;或者你在一家快速成长的科技公司担任核心角色&#xff0c;那么有一个问题你肯定反复思考过&#x…...

从多媒体到HPC:聊聊IBM GPFS(Spectrum Scale)那些鲜为人知的“前世今生”

从多媒体到HPC&#xff1a;IBM GPFS的技术进化与商业智慧 1993年&#xff0c;当第一代数字视频编辑系统还在为处理480p分辨率视频而焦头烂额时&#xff0c;IBM实验室里的一组工程师正在解决一个更根本的问题——如何让多个工作站同时高效访问同一组视频素材。这个看似简单的需求…...

机器学习模型安全防护与TEE技术实践

1. 机器学习模型安全与完整性挑战概述 在金融风控、医疗诊断等关键领域&#xff0c;机器学习模型的安全与完整性已成为AI落地的首要考量。过去三年中&#xff0c;恶意数据投毒攻击增长了近300%&#xff0c;而预训练模型供应链中的安全漏洞更是导致了多起重大数据泄露事件。这些…...

droidrun-agent:基于MCP协议连接AI智能体与安卓设备的自动化桥梁

1. 项目概述&#xff1a;当AI助手需要“动手”时在AI Agent&#xff08;智能体&#xff09;领域&#xff0c;我们常常遇到一个瓶颈&#xff1a;模型可以生成完美的计划、写出漂亮的代码&#xff0c;但它如何与真实世界交互&#xff0c;尤其是如何操作一台物理设备&#xff1f;比…...

大模型选型生死局(企业CTO私藏对比清单):Claude在长文档法律分析胜出32%,Gemini在实时多跳检索快4.8倍——你的业务该选谁?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;大模型选型生死局&#xff1a;Claude vs Gemini核心能力全景图 在企业级AI应用落地的关键阶段&#xff0c;模型选型已远非单纯比拼参数量或基准分数&#xff0c;而是对推理鲁棒性、上下文工程适配度、多…...

观察不同时段通过Taotoken调用大模型的延迟稳定性表现

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观察不同时段通过Taotoken调用大模型的延迟稳定性表现 在项目开发与线上服务中&#xff0c;API调用的响应延迟是影响开发者体验和系…...