之前我在项目中要用到消息队列相关的技术时,一直让Redis兼职消息队列功能,一个偶然的机会接触到了MSMQ消息队列。秉着技术还是专业的好为原则,对MSMQ进行了学习,以下是我个人的学习笔记。
一、什么是MSMQ
在我理解中,消息队列就是一个数据的容器,并且可以异步处理数据,提高数据的并发性。比如投递简历:用人单位就像是消息队列,在同一时间,可以接受大量的简历(数据)。然后等回公司了再一份一份的取出查看。
二、MSMQ功能启动(win 7为例)
好多系统默认是不开启消息队列(MSMQ)的。故,我们要手动开启。具体流程为:打开控制面板-》程序和功能-》打开或关闭Windows功能(时间比较长)-》勾选Microsoft Message Queue(MSMQ)服务器;即可。如图所示:
1、
2、
3、
完成以上操作,MSMQ便正常启动了;
三、创建一个消息队列(暂做了解,代码也可以创建,感觉代码更方便直观)
我们通过打开计算机管理,就可以看到消息队列的内容了。(计算机管理打开方式:控制面板-》管理工具-》计算机管理)如图:
我们可以看出,系统给我们提供了四种队列,但是我们用户只能使用专用队列这一项。队列地址以private$开头。
我们可以尝试创建一个专用队列,"右击"专用队列,再点击"新建",得到新增界面如下图。
对话框里面有一个事务性,说明MSMQ是支持事物提交,由于目前没有涉及到事物性,因此暂不讲解。
我们起一个名为test的消息队列点击确定,我们便可以看到在右侧出现了一个名为test的队列。
四、怎么样在.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进行简单的数据存储。之后有更高级的用法我再补充。谢谢!