简介

        它是一种异步传输模式,可以在不同的应用之间实现相互通信,相互通信的应用可以分布在同一台机器上,也可以分布于相连的网络空间中的任一位置。

它的实现原理是:消息的发送者把自己想要发送的信息放入一个Message中,然后把它保存至一个系统公用空间的消息队列(Message Queue)中;本地或者是异

地的消息接收程序再从该队列中取出发给它的消息进行处理。如图所示:

    消息队列应用

优缺点与使用场景

  • 优缺点

    优点:支持离线通讯;有消息优先级;有保障的消息传递和执行许多业务处理的可靠的防故障机制;息传递机制使得消息通信的双方具有不同的物理平台成为可能。

        缺点:很难满足实时交互需求。

  • 使用场景

        1、数据采集:适合多设备多应用数据采集功能。

        2、辅助实时交互:在大并发系统中,某一个操作涉及到很多步骤,某些步骤是不需要及时处理的,将不需要及时处理的步骤提出来,用消息队列处理。

比如:在一个高并发购物网站,一个顾客下单,顾客的操作记录、顾客的余额记录、商品相关的统计记录是不需要及时处理的,这些可以放消息队列处理,

延时处理。

        3、多线程流水线处理:可以应用于生产者和消费者模式里面。比如:批量文件解压+解析+入库处理。为了降低服务器压力,将各个步骤分布在不同的

服务器上面,每个步骤的结果可以放入消息队列。

准备工作

  • 环境准备

        在使用MSMQ开发之前,需要安装消息队列。按顺序操作:控制面板-》程序-》打开或关闭Windows功能,勾选MSMQ服务器所有选项,如图所示:

        消息队列应用

  • 存放位置 

       在调试、操作队列的时候,插入和取出队列信息以后,需要查看操作是否成功,就得去存放队列的服务器中查看队列信息。操作顺序:计算机-》管理-》

服务和应用程序,在里面有相应队列存储的信息,如图所示:

        消息队列应用

MSMQ的代码封装

  • 基础准备

         文件作用:

   消息队列应用

      MSMQ队列操作的属性设置:

    /// <summary>
    /// MSMQ队列操作的属性设置
    /// </summary>
    public class MessageQueueSettings
    {
        /// <summary>
        /// 专用队列的基本路径
        /// </summary>
        private string basePath = "private$";

        /// <summary>
        /// 队列的ID
        /// </summary>
        public Guid MessageQueueId { get; set; }

        /// <summary>
        /// 队列的标签
        /// </summary>
        public string MessageQueueLabel { get; set; } = "由程序创建的默认消息队列";

        /// <summary>
        /// 访问队列的路径,默认是本机,记做“.”
        /// </summary>
        public string RemotePath { get; set; } = ".";

        /// <summary>
        /// 队列名称:默认是 msmqdefault
        /// </summary>
        public string MessageQueueName { get; set; } = ConfigSource.DefaultMSMQName;

        /// <summary>
        /// 队列的路径
        /// </summary>
        public string MessageQueuePath => $"{RemotePath}\\{basePath}\\{MessageQueueName}";

        /// <summary>
        /// 消息队列类型
        /// </summary>
        public QueueType MessageQueueType { get; set; } = QueueType.PrivateQueue;

        /// <summary>
        /// 获取或设置队列日志的大小
        /// </summary>
        public long MaximumJournalSize { get; set; } = uint.MaxValue;

        /// <summary>
        /// 是否启用日志
        /// </summary>
        public bool UseJournalQueue { get; set; } = true;

        /// <summary>
        /// 获取或设置队列的大小
        /// </summary>
        public long MaximumQueueSize { get; set; } = uint.MaxValue;

        /// <summary>
        /// 是否启用队列事务
        /// </summary>
        public bool IsUseTransaction { get; set; } = true;

        /// <summary>
        /// 队列的访问方式
        /// </summary>
        public QueueAccessMode AccessMode { get; set; } = QueueAccessMode.SendAndReceive;

        /// <summary>
        /// 设置/获取是否经过身份验证
        /// </summary>
        public bool Authenticate { get; set; } = false;

        /// <summary>
        /// 获取或设置基优先级,“消息队列”使用该基优先级在网络上传送公共队列的消息。
        /// </summary>
        public short BasePriority { get; set; } = 0;

    }
View Code

相关文章:

  • 2021-05-18
  • 2021-11-01
  • 2022-12-23
  • 2021-05-08
  • 2021-11-19
  • 2021-11-19
猜你喜欢
  • 2022-12-23
  • 2021-11-19
  • 2022-02-08
  • 2021-05-10
  • 2021-12-11
  • 2022-12-23
  • 2021-07-21
相关资源
相似解决方案