一、MSMQ的安装
操作系统:Windows10
使用MSMQ进行软件开发需要安装MSMQ,安装完后就该进入实际的开发阶段。具体的安装过程就是在控制面板里“添加/删除程序”下“添加/删除Windows组件”,完成添加就OK。安装完成后就可以通过交互界添加新的消息队列,详细如下图
点击”确定“后,如下图:
右键我的电脑-管理---服务和应用程序下 会看到 “消息队列”,然后如下图:
Win+R,执行servers.msc,查看MSMQ服务是否启动:
二、MSMQ的处理流程
消息队列对整个框架的性能提升有了很大的进步,它包括创建消息、发送消息、接收消息、删除消息、异步消息处理。其中整体上还是比较相似的,在其中的一些过程中可以添加事务来保证操作的完整性。
MSMQ消息队列中定义的消息由一个主体(body)和若干属性构成。消息的主体可以由文本,二进制构成,根据需要还可以被加密。在MSMQ中消息大小不能够超过4MB。
三、MSMQ简单应用
在.NET中微软对MQ做了封装,把MQ有关的信息封装到了MessageQueue类中,在开发的时候可以直接引用该类,对队列中的消息做操作。
首先工程中添加引用:System.Messaging.dll
1、MSMQ的创建和发送
在操作消息前首先要为消息指定存储的队列,所以在创建“消息”时首先要在服务器上创建一个“队列”,然后为MessageQueue指定消息队列的路径。
class Program
{
static void Main(string[] args)
{
//定义 MQ 地址
string ekQ = ".\\Private$\\TestQueue";
//如果不存在ekQ消息队列,则创建该消息队列
if (!MessageQueue.Exists(ekQ))
MessageQueue.Create(ekQ);
//创建消息队列对象
var queue = new MessageQueue(ekQ);
for (int i = 0; i < 2; i++)
{
//创建要发送的实体
Test test = new Test();
test.Name = "fdsfd";
test.Sex = "cvx";
//序列化实体
string str = Program.xmlSerial(test);
//发送消息到队列
queue.Send("Test" + str);
Console.WriteLine("Message sent {0} \n--------------", "Test" + str);
}
Console.Read();
// 删除消息队列
// MessageQueue.Delete(ekQ);
}
/// <summary>
/// 序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="serializeClass"></param>
/// <returns></returns>
public static string xmlSerial<T>(T serializeClass)
{
string xmlString = string.Empty;
XmlWriterSettings settings = new XmlWriterSettings();
XmlSerializer serializer = new XmlSerializer(typeof(T));
StringBuilder xmlStringBuilder = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(xmlStringBuilder))
{
serializer.Serialize(writer, serializeClass);
xmlString = xmlStringBuilder.ToString();
}
return xmlString;
}
}
/// <summary>
/// 消息实体
/// </summary>
public class Test
{
public string Name { get; set; }
public string Sex { get; set; }
}
对应生成的的结果如下:
运行上面的代码后MQ将会把消息发送到相应的消息队列中,这里采用的是专有队列所以会将消息发送到本地的队列中。这样在消息的发送方和调用方之间就构建了一个相互松耦合的桥梁,进入“计算机管理”中查看消息,如下图所示:
2、MSMQ的接收
namespace MsqueueReaderTest
{
class Program
{
static void Main(string[] args)
{
string ekQ = ".\\Private$\\TestQueue";
if (MessageQueue.Exists(ekQ))
{
// 创建消息队列对象
using (MessageQueue mq = new MessageQueue(ekQ))
{
// 设置消息队列的格式化器
mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });//mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
foreach (Message msg in mq.GetAllMessages())
{
Console.WriteLine("Received Message is: {0} \n--------------", msg.Body);
}
// 获得消息队列中第一条可用消息
Message firstmsg = mq.Receive();
Console.WriteLine("Received The first Message is: {0} \n--------------", firstmsg.Body);
}
}
Console.Read();
}
}
}
对应生成的的结果如下:
在上例中我们使用的同步Receive方法,而且该方法会将消息队列中的消息取出并删除,所以在操作完成后消息队列中的消息会为空,所以运行后的队列为下图: