初识Message Queue之--基础篇

时间:2023-12-09 19:21:43

之前我在项目中要用到消息队列相关的技术时,一直让Redis兼职消息队列功能,一个偶然的机会接触到了MSMQ消息队列。秉着技术还是专业的好为原则,对MSMQ进行了学习,以下是我个人的学习笔记。

一、什么是MSMQ

在我理解中,消息队列就是一个数据的容器,并且可以异步处理数据,提高数据的并发性。比如投递简历:用人单位就像是消息队列,在同一时间,可以接受大量的简历(数据)。然后等回公司了再一份一份的取出查看。

二、MSMQ功能启动(win 7为例)

好多系统默认是不开启消息队列(MSMQ)的。故,我们要手动开启。具体流程为:打开控制面板-》程序和功能-》打开或关闭Windows功能(时间比较长)-》勾选Microsoft Message Queue(MSMQ)服务器;即可。如图所示:

1、初识Message Queue之--基础篇初识Message Queue之--基础篇

2、初识Message Queue之--基础篇

3、初识Message Queue之--基础篇

完成以上操作,MSMQ便正常启动了;

三、创建一个消息队列(暂做了解,代码也可以创建,感觉代码更方便直观)

我们通过打开计算机管理,就可以看到消息队列的内容了。(计算机管理打开方式:控制面板-》管理工具-》计算机管理)如图:

初识Message Queue之--基础篇

我们可以看出,系统给我们提供了四种队列,但是我们用户只能使用专用队列这一项。队列地址以private$\开头。

我们可以尝试创建一个专用队列,"右击"专用队列,再点击"新建",得到新增界面如下图。

初识Message Queue之--基础篇

对话框里面有一个事务性,说明MSMQ是支持事物提交,由于目前没有涉及到事物性,因此暂不讲解。

我们起一个名为test的消息队列点击确定,我们便可以看到在右侧出现了一个名为test的队列。

初识Message Queue之--基础篇

四、怎么样在.NET中使用MSMQ

对于.NET来说,微软封装了操作MSMQ的类,MessageQueue ;该类需要引入命名空间System.Messaging;

以下分模块介绍MessageQueue 中的主要方法:

1、创建MSMQ队列(Create)

            string path =".\\private$\\"+ "test";//设置消息队列路径
if (!MessageQueue.Exists(path))//判断该路径是否存在
{
MessageQueue.Create(path);//如果不存在则创建
}
MessageBox.Show("ok");

2、发送数据(Send)

          string path = ".\\private$\\" + "test";//设置消息队列路径
MessageQueue msqs = new MessageQueue(path);//创建指定路径下的消息队列对象
Message ms = new Message();//创建消息对象
ms .Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });//设置消息的Formatter数据类型
msqs.Send(ms);
MessageBox.Show("成功");

注:在发送时,尽量使用消息队列对象指定一个Formatter类型(用Formatter属性)。在接收和发送均用相同类型。否则有可能程序在Receive时就抛异常。

3、接收数据(Receive)

            string path = ".\\private$\\" + "test";//设置消息队列路径
MessageQueue msqs = new MessageQueue(path);//创建指定路径下的消息队列对象
System.Messaging.Message mes = msqs.Receive();//获取单条数据(如果没有数据,当前进程会被阻塞)
string message = mes.Body.ToString();//获取Message内的内容
MessageBox.Show(message);

注:Receive方法在没有数据接收时,会阻塞线程。因此,建议放在单独的线程中运行,以保证程序的稳定运行;

Message是MSMQ的一个数据容器,其中数据存储在Body中。Body是一个已经被序列化的数据。故,在使用时要转换为相应的类型。

以上是基础的MSMQ的使用方式,掌握上述技术,可以使用MSMQ进行简单的数据存储。之后有更高级的用法我再补充。谢谢!