首先说一下,消息队列 (MSMQ Microsoft Message Queuing)是MS提供的服务,也就是Windows操作系统的功能,并不是.Net提供的。

消息队列(MSMQ)技术使得运行于不同时间的应用程序能够在各种各样的网络和可能暂时脱机的系统之间进行通信。

应用程序将消息发送到队列,并从队列中读取消息。

下图演示了消息队列如何保存由多个发送应用程序生成的消息,并被多个接收应用程序读取。

消息一旦发送到队列中,便会一直存在,即使发送的应用程序已经关闭。

MSMQ服务默认是关闭的,(Window7及以上操作系统)按以下方式打开

1、打开运行,输入"OptionalFeatures",钩上Microsoft Message Queue(MSMQ)服务器。

消息队列(Message Queue)是一种使用队列(Queue)作为底层存储数据结构,可以用于解决不同进程与应用程序之间通讯的分布式消息容器,也可以称为消息中间件。

目前比较常用的消息队列有ActiveMQ、RabbitMQ、MSMQ ,Kafka、RocketMQ、Redis等。

消息队列和队列有什么区别呢?

唯一的区别在于入队列的时候称为生产者,出队列的时候称为消费者。

我理解的MSMQ

MSMQ可以被看成一个数据储存装置,就如同数据库,只不过数据存储的是一条一条的记录,而MSMQ存储的是一个一个的消息(messsge)。Message可以被理解为一种数据容器,我们在稍后会讲到。MSMQ一个重要的应用场景就是离线信息交互,例如,我们在给朋友发送邮件,而此时朋友并未登入邮箱,这个时候我们的邮件就可以发到邮件服务器的MSMQ队列中,当朋友登入邮箱的时候,系统在从服务器的MSMQ队列中取出U件。当然MSMQ的用途远不止这些,例如,充当数据缓存,实现异步操作等等,这里就不在一一举例了。

系统的消息队列,为我们提供了3种队列传出队列,专用队列和系统队列,而用户能自由创建的只有专用队列。我们可以尝试创建一个专用队列,"右击"专用队列,再点击"新建",得到新增界面如下图。由于我们创建的是专用队列,所以在队列命名上面显示的添加"private$",另一个事务复选框表示我们要创建的是队列是否为事务队列,这个在稍后我会详细的解释

我在专用队列里面添加一个叫"shaoshun"的专用队列,在专用队列文件夹下面就可以找到,如图

消息

消息是MSMQ的存储对象,封装为System.Messaging.Message对象,它由一个主体(body)和若干属性构成,其中我们的用户数据通常被序列化装入body主体中,这也是我们称它为数据容器的原因。除了body属性,还有几个属性相对来说比较重要:Priority(消息的优先级),Label(用户定义的消息标识),Formatter(消息的序列组件,当用户将复杂类型数据填充到body中,用户的数据会先被序列化)

队列

  在前面,我们通过手动创建了一个专用队列。我们知道队列分事务性队列和非事务性队列,默认创建的是非事务性队列。当我们勾选事务性复选框,我们就会创建事务性队列,那么什么是事务性队列呢?事务性队列将消息保存在磁盘上,实现了持久化,也就是说当我们关机,断电后,下次再启动机器,我们的消息依然保存在队列里面,而非事务性队列则将消息保存在内存中,也就是说我重启电脑后,队列里面的消息将不存在了。

队列支持事务操作,当我们把对多个消息的接收操作纳入一个事务中,那么只要有一个消息接收不成功,队列将抛弃前面接收的所有消息,实现事务回滚。队列事务同时支持消息按顺序接收与发送。

实例:

需要先引用System.Messaging.dll

#region 消息队列
using System;
using System.Collections.Generic;
using System.Linq;
using System.Messaging;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace test
{class Program{static void Main(string[] args){#region 创建消息队列  const string queueName = @".\Private$\jiyiqin";MessageQueue mq = null;if (!MessageQueue.Exists(queueName))// 如果指定的路径queueName中不存在队列,那么在该路径,即queueName中创建一个消息队列。jiyiqin就是你想要创建消息队列的名字{mq = MessageQueue.Create(queueName);//创建名称jiyiqin的消息队列的实例。Console.WriteLine("创建消息队列完成:" + queueName);}else  //如果消息队列jiyiqin已经存在,那么创建该消息队列的一个实例{mq = new MessageQueue(queueName);//创建名称jiyiqin的消息队列的实例。}mq.SetPermissions("Administrator", MessageQueueAccessRights.FullControl);mq.SetPermissions("ANONYMOUS LOGON", MessageQueueAccessRights.FullControl);mq.SetPermissions("Everyone", MessageQueueAccessRights.FullControl);#endregion#region 发送消息队列string strTx = "123我";Message msgTx = new Message();msgTx.Body = strTx;msgTx.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });mq.Send(msgTx);#endregion#region 接收消息队列//接收到的消息对象Message msgRx = mq.Receive();//指定格式化程序msgRx.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });//接收到的内容string strRx = msgRx.Body.ToString();System.Windows.Forms.MessageBox.Show(strRx);#endregion}}
}

需加微信交流群的,请加小编微信号zls20210502,切记备注 加群,小编将会第一时间邀请你进群!(目前①群已满 ,需要在②群排队等坑位)

C# 消息队列之MSMQ相关推荐

  1. Redis学习笔记~实现消息队列比MSMQ更方便

    回到目录 什么是队列:简单的说就是数据存储到一个空间里(可以是内存,也可以是物理文件),先存储的数据对象,先被取出来,这与堆栈正好相反,消息队列也是这样,将可能出现高并发的数据进行队列存储,并按着入队 ...

  2. .net微软消息队列(msmq)简单案例

    1.首先我们需要安装消息队列服务,它是独立的消息记录的服务,并保存在硬盘文件中. 我们添加名为:DMImgUpload的私有消息队列. 2.定义消息队列的连接字符串建议采用IP: (1)FormatN ...

  3. MQ消息队列之MSMQ

    主要参考文章: 消息队列(Message Queue)简介及其使用 转载于:https://www.cnblogs.com/mailaidedt/p/6599130.html

  4. MSMQ消息队列演示程序

    对消息队列的概念在此就不用描述了,网上查"消息队列"或MSMQ关键词,有相应文章介绍. 我在这里提供了一个示例程序,在于让初学者快速上手. 1.  下载我的示例程序,下载地址为:h ...

  5. C#使用消息队列(MSMQ)

    (1).认识消息队列 首先说一下,消息队列 (MSMQ Microsoft Message Queuing)是MS提供的服务,也就是Windows操作系统的功能,并不是.Net提供的. MSDN上的解 ...

  6. 【消息队列】五个问题详解消息中间件

    1.消息中间件是什么 消息队列,又叫做消息中间件.是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程 ...

  7. C#.net创建一个简单的消息队列程序(MessageQueue)

    MessageQueue:消息队列,现在应用也是越来越广泛,如微信朋友圈,可以概括为仅仅两条消息队列,消息队列常用于处理高并发的问题,当我们在实际应用中发现接收到数据量过多时,可以使用队列. 微软提供 ...

  8. 消息队列工具类(MSMQ)

    所要做的是简化msmq的调用代码以及做到可替代性,实现后,调用消息队列代码变为如下所示: QueueService srv = QueueService.Instance();//检查存储DTO1的队 ...

  9. MSMQ消息队列安装

    一.Windows 7安装.管理消息队列 1.安装消息队列   执行用户必须要有本地 Administrators 组中的成员身份,或等效身份.    具体步骤:     开始->控制面板-&g ...

最新文章

  1. linux虚拟机启动网卡命令,命令行下无法联网怎么办,vmware下安装archlinux实现网络连接,实机grub引导启动linux...
  2. 四川大学计算机学院2020推免公示,四川大学2020年推免生录取情况分析
  3. python用途与前景-python能用来干什么
  4. 如何检测整数相加溢出
  5. APP技巧:手机该不该每天关机一次?看完才恍然大悟!
  6. C#通过SSH连接MySql
  7. iphone屏幕突然变暗_如果你的iPhone屏幕突然变暗,可以这样解决
  8. 【演讲实录】银行PB级别海量非结构化数据管理实践
  9. OpenCV的Mat和Halcon的HObject类型互相转换
  10. OpenCV-Python实战(番外篇)——利用 K-Means 聚类进行色彩量化
  11. Spark StructType 类型详解
  12. Java中的指针---Unsafe应用解析
  13. 天猫运动户外狂欢日来了!700多个大牌要如何回馈消费者
  14. 全球名校AI课程库(23)| Harvard哈佛 · 基于Python/JavaScript的Web编程课程『Web Programming with Python and JavaScript』
  15. 全球货币市场基础知识系列4
  16. 微信绑定会员卡服务器出错,微信会员卡跳转到微信小程序出现如下错误?
  17. 流量负载_指挥流量:揭开互联网规模负载平衡的神秘面纱
  18. Elasticsearch嵌套式对象Nested分析
  19. 努力学英语——从背单词开始
  20. Bezier、B样条曲线曲面

热门文章

  1. 黑马C++设计模式2
  2. LeetCode 最大正方形
  3. Keras 获取中间某一层输出
  4. 部署也是工程的一部分,也要编程(自动化)
  5. poj 1679: The Unique MST【次小生成树】
  6. jquery如何获取元素的滚动高度
  7. SRM 588 D2 L2:GUMIAndSongsDiv2,冷静思考,好的算法简洁明了
  8. 开发针对特殊租户的Teams机器人
  9. 计算机网络拓跋结构,实战 | 服务端开发与计算机网络结合的完美案例
  10. 时代聚焦AI安全——可解释性