http://tech.ddvip.com/2009-01/1232014079105979.html
一、MSMQ介绍和安装消息队列
使用消息队列的优点:稳定、消息优先级、脱机能力以及安全性。
消息队列分为用户创建的队列(专用队列private)和系统队列(public).
专用队列是不在 Active Directory 中发布而只在包含它们的本地计算机上显示的队列.
在域环境中,公用队列是 Active Directory 中发布的队列,因此通过整个Windows Server家族林进行复制。请注意,只复制这些队列的属性,而不是实际队列本身或队列内容。倘若用户有足够的权限访问适用的队列对象,则林中任意一台计算机都有可能访问有关公用队列的有关信息。一般说来,林中任何一个可访问ActiveDirectory 并对给定公用队列具有发送权限的用户,都可以发送消息给公用队列。
关于如何安装 MSMQ,请参看 http://blog.csdn.net/akey307/article/details/6933632
二、创建、删除和管理队列
要开发MSMQ程序就必须学习一个很重要的类(MessageQueue),该类位于名称空间System.Messageing下。其中有几个常用的方法必须掌握:
--Create方法:创建使用指定路径的新消息队列。
--Delete方法:删除现有的消息队列。
--Exists方法:查看指定消息队列是否存在。
--GetAllMessages()方法:得到队列中的所有消息。
--GetPublicQueues方法:在“消息队列”网络中定位消息队列。
--Peek/BeginPeek方法:查看某个特定队列中的消息队列,但不从该队列中移出消息。
--Receive/BeginReceive方法:检索指定消息队列中最前面的消息并将其从该队列中移除。
--Send方法:发送消息到指定的消息队列。
--Purge方法:清空指定队列的消息。
三、发送和序列化消息
MSMQ消息队列中定义的消息由一个主体(body)和若干属性构成。消息的主体可以由文本、二进制构成,根据需要还可以被加密。在MSMQ 中消息的大小不能够超过4MB。发送消息是通过Send方法来完成的,需要一个Message参数。
1、发送消息:
步骤:连接队列-->指定消息格式-->提供要发送的数据(主体)-->调用Send()方法将消息发送出去。详细见后面的示例程序。
2、序列化消息:
消息序列化可以通过.NETFramework附带的三个预定义格式化程序来完成:
-- XMLMessageFormatter对象----MessageQueue组件的默认格式化程序设置。
-- BinaryMessageFormatter对象;
-- ActiveXMessageFormatter对象;
由于后两者格式化后的消息通常不能为人阅读,所以我们经常用到的是XMLMessageFormatter对象。该对象构造方法有三种重载:
publicXmlMessageFormatter();
publicXmlMessageFormatter(string[] targetTypeNames);
publicXmlMessageFormatter(Type[] targetTypes);
示例:
static void Main(string[] args)
{
string queuename = "myqueue";
Createqueue(queuename);
//SendMessage(queuename, "message content");
ReceiveMessage(queuename);
}
public static void Createqueue(string queuePath)
{
try
{
if (!MessageQueue.Exists(".\\private$\\" + queuePath))
{
MessageQueue.Create(".\\private$\\" + queuePath);
}
else
{
Console.WriteLine(queuePath + "already exists");
}
}
catch (MessageQueueException ex)
{
Console.WriteLine(ex.Message);
}
}
public static void SendMessage(string queuename, string msg)
{
MessageQueue myQueue = new MessageQueue(".\\private$\\" + queuename);
Message myMessage = new Message();
myMessage.Body = msg;
myMessage.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
myQueue.Send(myMessage);
}
public static void ReceiveMessage(string queuename)
{
MessageQueue myQueue = new MessageQueue(".\\private$\\" + queuename);
myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
try
{
Message myMessage = myQueue.Receive();
string context = (string)myMessage.Body;
Console.WriteLine("message:" + context);
}
catch (MessageQueueException e)
{
Console.WriteLine(e.Message);
}
catch (InvalidCastException e)
{
Console.WriteLine(e.Message);
}
}
四、事务性消息处理
事务我想大家对这个词应该都不会陌生,在操作数据库的时候经常都会用到事务,确保操作成功,要么全部完成(成功),要么全部不完成(失败)。在MSMQ中利用事务性处理,可以确保事务中的消息按照顺序传送,只传送一次,并且从目的队列成功地被检索。
那么,在MSMQ上使用事务性处理怎么实现呢?可以通过创建MessageQueueTransation类的实例并将其关联到MessageQueue组件的实例来执行,执行事务的Begin方法,并将其实例传递到收发方法。然后,调用Commit以将事务的更改保存到目的队列。
示例:
public static void SendMessageTransaction()
{
MessageQueue myQueue = new MessageQueue(".\\private$\\myQueueTrans");
Message myMessage = new Message();
myMessage.Body = "good afternoon";
myMessage.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
MessageQueueTransaction myTransaction = new MessageQueueTransaction();
myTransaction.Begin();
myQueue.Send(myMessage, myTransaction);
myTransaction.Commit();
Console.WriteLine("success!");
}
public static void ReceiveMessageTransaction()
{
MessageQueue myQueue = new MessageQueue(".\\private$\\myQueueTrans");
myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
if (myQueue.Transactional)
{
MessageQueueTransaction myTransaction = new MessageQueueTransaction();
myTransaction.Begin();
Message myMessage = myQueue.Receive(myTransaction);
string context = myMessage.Body as string;
myTransaction.Commit();
Console.WriteLine("message:" + context);
}
}