什么是MSMQ

Message Queuing(MSMQ) 是微软开发的消息中间件,可应用于程序内部或程序之间的异步通信。主要的机制是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。下图展示了这一流程

MSMQ

MSMQ队列是一个可持久的队列,因此不必担心不间断地插入队列会导致数据的丢失,在网站系统中不用担心网站挂掉后数据丢失问题。
MSMQ微软消息队列,这个是个很好的异步通信技术。非常类似于我们手机发短信,虽然对方关机了,但只要一开机通信服务器仍然自动会传送信息。所以MSMQ有这样的时间监控技术.很实用.可以确保通信的稳定性.

使用MSMQ的基本流程

1. 启动MSMQ服务,【控制面板】--【程序与功能】--【关闭/打开windows功能】--添加MSMQ功能,勾选全部选项。

控制面板->控制面板->所有控制面板项->程序和功能->选中安装

启用MSMQ

  2. 创建Message Queue队列。
  3. 打开Message Queue队列。
  4. 将消息发送至Message Queue队列或者从Message Queue队列中接收消息。
  5. 关闭Message Queue队列。

C# 中使用MSMQ

使用MessageQueue类操作MSMQ,其在System.Messaging命名空间下,需要添加引用

定义的接口

public interface IMessageSender<T> : IDisposable
{/// <summary>///     发送消息/// </summary>/// <param name="message">消息对象</param>void SendMessage(T message);void SendMessages(List<T> message);/// <summary>///     发送消息/// </summary>/// <param name="message">消息对象</param>/// <param name="label">消息标签</param>void SendMessage(T message, string label);
}

接口实现

/// <summary>
///     消息队列对象,由MQueueFactory创建指定路径的队列对象,可发送或批量接收消息。
/// </summary>
/// <typeparam name="T">消息队列存储的消息对象类型</typeparam>
public sealed class MQueue<T> : IDisposable, IMessageSender<T>, IMessageReceiver<T>
{public MQueue(MessageQueue mq, string user = "Everyone"){InnerQueue = mq;InnerQueue.Formatter = new XmlMessageFormatter(new[] { typeof(T) });InnerQueue.SetPermissions(user ?? "Everyone",MessageQueueAccessRights.GenericRead | MessageQueueAccessRights.DeleteMessage |MessageQueueAccessRights.DeleteQueue | MessageQueueAccessRights.DeleteJournalMessage);}#region IMessageSender/// <summary>///     内部消息队列对象/// </summary>private MessageQueue InnerQueue { get; set; }/// <summary>///     发送消息/// </summary>/// <param name="message">消息对象</param>public void SendMessage(T message){InnerQueue.Send(message);}public void SendMessages(List<T> message){foreach (var item in message){InnerQueue.Send(item);}}/// <summary>///     发送消息/// </summary>/// <param name="message">消息对象</param>/// <param name="label">消息标签</param>public void SendMessage(T message, string label){try{InnerQueue.Send(message, label);}catch (Exception ex){var path = InnerQueue.Path;InnerQueue = new MessageQueue(path);}}#endregion #region IMessageReceiver/// <summary>/// 获取队列中所有消息/// </summary>/// <typeparam name="T">消息类型</typeparam>/// <param name="exTarget">异常时触发</param>/// <returns></returns>public List<T> GetAllMessages<T>(MQExceptionTarget exTarget = null){return GetMessagesByNum<T>(null, exTarget);}/// <summary>/// 获取队列中指定数量消息/// </summary>/// <typeparam name="T">消息类型</typeparam>/// <param name="num">一次最多取num条数据,默认取所有数据</param>/// <param name="exTarget">异常委托</param>/// <returns></returns>public List<T> GetMessagesByNum<T>(int? num = null, MQExceptionTarget exTarget = null){var list = new List<T>();if (num.HasValue && num <= 0){return list;}MessageEnumerator enumerator = InnerQueue.GetMessageEnumerator2();while (enumerator.MoveNext()){Message msg = enumerator.RemoveCurrent();enumerator.Reset();if (msg != null){try{list.Add((T)msg.Body);if (num.HasValue && list.Count >= num){break;}}catch (Exception ex){if (exTarget != null)exTarget(ex);}}}return list;}#endregionpublic void Dispose(){if (InnerQueue != null){InnerQueue.Dispose();}}
}

建立队列工厂

/// <summary>
///  消息队列工厂,通过指定路径创建或获取相应队列对象
/// </summary>
public class MQueueFactory
{/// <summary>///     默认队列路径,在未指定路径的情况下,将创建并返回该路径的消息队列对象/// </summary>private const string DefaultPath = @".\private$\myQueue";/// <summary>///     创建默认路径的消息队列对象/// </summary>/// <typeparam name="T">消息队列存储的消息对象类型</typeparam>/// <returns></returns>public static MQueue<T> Create<T>(){return Create<T>(DefaultPath);}/// <summary>///     创建指定路径的消息队列路径/// </summary>/// <typeparam name="T">消息队列存储的消息对象类型</typeparam>/// <param name="connStr">指定的消息队列链接字符串 def:".\private$\myQueue"</param>/// <param name="autoCreate">不存在则创建队列 远程地址不能创建</param>/// <param name="user">获得队列额外权限的个人、组或计算机</param>/// <param name="cacheKey">web中Cache键值</param>/// <returns></returns>public static MQueue<T> Create<T>(string connStr=@".\private$\myQueue", bool autoCreate = false, string user = "Everyone", string cacheKey = "MQCache"){string path = connStr ?? DefaultPath;HttpContext httpContext = HttpContext.Current;if (autoCreate && !MessageQueue.Exists(path)){MessageQueue.Create(path);}var mq = new MessageQueue(path);if (httpContext != null){string key = "MQueue" + typeof(T).Name + cacheKey;if ((httpContext.Cache[key] == null)){httpContext.Cache[key] = new MQueue<T>(mq);}return httpContext.Cache[key] as MQueue<T>;}return new MQueue<T>(mq,user);}
}

写入队列

MQueueFactory.Create<string>(@".\private$\myQueue", autoCreate: true).SendMessage("我是写入的数据~~~");

获取消息

MQueueFactory.Create<string>(@".\private$\myQueue").GetAllMessages<string>();

代码来源:https://www.cnblogs.com/morang/p/mqdemo-msmq.html

以图形化的方式查看消息队列中的消息

运行输入 compmgmt.msc,打开计算机管理,选择[服务和应用程序-消息队列]。只要消息队列中的消息没有被接收,就可以在这里查看得到。

查看消息队列

微软消息队列-MicroSoft Message Queue(MSMQ)队列的C#使用相关推荐

  1. Microsoft Message Queue(MSMQ:微软消息队列)简介

    一.前言 最近在安装公司的一个产品时,接触到了MSMQ,在此对MSMQ做一个简单的介绍,以便各位能对它有一个快速.直观的认识.本文针对于Microsoft Message Queue,以下提到的消息队 ...

  2. MSMQ(MicroSoft Message Queue,微软消息队列)

    MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位 ...

  3. MSMQ(Microsoft Message Queue)介绍

    利用 MSMQ(Microsoft Message Queue),应用程序开发人员可以通过发送和接收消息方便地与应用程序进行快速可靠的通信.消息处理为您提供了有保障的消息传递和执行许多业务处理的可靠的 ...

  4. 消息队列中间件 Message Queue 简称:MQ

    一.什么是消息队列? 消息队列,一般我们会简称它为MQ(Message Queue) 队列是一种先进先出的数据结构. 现有常用的开源消息中间件有Kafka.CMQ.JBoss Messaging.JO ...

  5. 进程间通信——消息队列(Message queue)

    在Linux中,IPC消息队列是一个双向通信的全内存设计,即内核保证了读写顺序和数据同步,并且是性能比较好的先进先出的数据结构.消息队列的应用场景:比如异步任务处理,抢占式的数据分发,顺序缓存区等. ...

  6. Linux--消息队列(message queue)

    消息队列 消息队列是消息的链接表 ,存放在内核中并由消息队列标识符标识.我们将称消息队列为 "队列",其标识符为"队列 I D". msgget()用于创建一个 ...

  7. WCF4.0新特性体验(9):非破坏性队列消息接收(Non-destructive queue receive )

    这次来介绍一下WCF4.0新特性体验(9):非破坏性队列接收(Non-destructive queue receive ).这个特性不是那么直观.确切来说是WCF4.0对于以前处理MSMQ消息队列机 ...

  8. 远程调用服务(RPC)和消息(Message Queue)对比及其适用/不适用场合

    在阿里的平台技术部参与开发了Dubbo(远程调用服务)和Napoli(消息解决方案),又给网站应用支持这2个产品很长一段时间,了解了这2个产品的实现及应用对这两个产品的用法. 大部分情况下," ...

  9. c语言程序结构环形队列入队,C语言 环形队列

    队列 :队列是一种先进先出的数据结构. 比如说 排队买票, 有一个售票口,最多能排30人,那么最大存储空间就是30人, 每当有1个新人过来排队,就会站在队尾,这就叫入队, 每当有1个人买到票了,就会离 ...

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

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

最新文章

  1. Java中的值传递和引用传递
  2. 密歇根大学28页最新《GANs生成式对抗网络综述:算法、理论与应用》最新论文,带你全面了解GAN技术趋势...
  3. Android Prelink实现的源码分析
  4. nextcloud icon_吉利ICON,我信任的好伙伴,感谢有你的陪伴
  5. 个人收集一些程序员面试题目(一) 一起分享
  6. 国家粮食与物资储备局揭示中国稻谷产毒真菌分布及仓储动态变化
  7. 10g CRS Clustware Installation安装图
  8. 增加一个输出,解决一个奇怪的死机
  9. OpenGL 下面的 glut freeglut glfw 都是个啥
  10. 智能机器人机器人心得_你是机器人吗
  11. 快速在越狱iphone手机下定位app安装包并且导出的方法
  12. Caused by: java.sql.SQLException: Field 'id' doesn't have a default value
  13. 基于C语言设计的无边框背景透明窗体
  14. 北京最好的商标律师解析商标侵权的处罚规定
  15. 2021-08-16
  16. 网站页面上标签页小图标的添加方式
  17. 【计算机科学基础】图灵机
  18. 独立性权重指标怎么计算?
  19. 获取token的一些方法
  20. 搜索引擎关键词优化可以怎么做?

热门文章

  1. Markdown编辑器——Editor.md的使用
  2. 物 理 学 简 介(三)
  3. 复印机扫描仪错误怎么回事_打印机扫描后出现错误怎么处理?
  4. 维护和维修涉密计算机网络 必须严格采取,安全保密管理员主要负责涉密网络的日常安全保密管理工作,包括()。A.涉密网络的日常运行维护工 - 普法考试题库问答...
  5. 《西点军校的经典法则》序 -- 責任(せきにん)、栄誉(えいよ)、国家(こっか)
  6. wps建立的文件后缀名为docx,写在里面的东西还不允许保存
  7. 那些年我们一起追逐过的安全工具
  8. python文件操作方法seek_Python文件操作及seek偏移详解
  9. ubuntu手动下载安装软件包
  10. org apache catalina LifecycleException Failed to start comp