WCF分布式开发必备知识系列文章1:MSMQ消息队列(2)
static void Main(string[] args)
2 {
3 //Create a public Queue
4 if (!MessageQueue.Exists(@".\FrankMSMQ"))//判断此路径下是否已经有该队列
5 {
6 using (MessageQueue mq = MessageQueue.Create(@".\FrankMSMQ"))
7 {
8 mq.Label = "FrankPublicQueue";设置队列标签
9 Console.WriteLine("FrankPublicQueue is Created:");
10 Console.WriteLine("Path is {0}:", mq.Path);
11 Console.WriteLine("FrankPublicQueue' name is {0}:", mq.QueueName);
12 //Console.Read();
13 mq.Send("MSMQ Message", "Frank.Xu");//发送消息
14 }
15 }//Create a private Queue私有消息队列
16 if (!MessageQueue.Exists(@".\Private$\FrankMSMQ"))
17 {
18 using (MessageQueue mq = MessageQueue.Create(@".\Private$\FrankMSMQ"))
19 {
20 mq.Label = "FrankPrivateQueue";
21 Console.WriteLine("FrankPrivateQueue is Created:");
22 Console.WriteLine("Path is {0}:", mq.Path);
23 Console.WriteLine("FrankPrivateQueue' name is {0}:", mq.QueueName);
24 //Console.Read();
25 mq.Send("MSMQ Private Message", "Frank.Xu");
26 }
27 }
28
29 //Get all public queues and send new messages
30 foreach (MessageQueue mq in MessageQueue.GetPublicQueues())//遍历所有的公共消息队列
31 {
32 mq.Send("Sending MSMQ public message" + DateTime.Now.ToLongDateString(),"Frank.Xu");//发送公共消息
33 //string mName = mq.MachineName;
34 Console.WriteLine("Public Message is sent to {0}:", mq.Path);
35 }
36 //find private queues and send new messages
37 if (MessageQueue.Exists(@".\Private$\FrankMSMQ"))//获得私有的消息队列
38 {
39 MessageQueue mq = new MessageQueue(@".\Private$\FrankMSMQ");
40 mq.Send("Sending MSMQ private message" + DateTime.Now.ToLongDateString(), "Frank.Xu");//发送消息到私有的消息队列里
41 Console.WriteLine("Private Message is sent to {0}:", mq.Path);
42 }
43 Console.Read();
44 }
比较重要的类就是MessageQueue,这行代码创建消息队列 MessageQueue mq = MessageQueue.Create(@".\FrankMSMQ"),参数是存放消息队列的位置.这个基本就完成了创建和发送消息的主程序.下面我们来建立一个客户端,来访问消息队列,获取消息,同样建立一个控制台应用程序,添加引用和代码:
namespace MSMQClient
2{
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 //Get public queue message
8 if (MessageQueue.Exists(@".\FrankMSMQ"))//判断是否存在消息队列
9 {
10
11 using(MessageQueue mq = new MessageQueue(@".\FrankMSMQ"))//创建消息队列对象
12 {
13 mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });//设置消息队列的格式化器
14 //mq.Send("Sample Message", ":Label");
15 Message msg = mq.Receive();//从队列接受消息
16 Console.WriteLine("Received MSMQ Message is :{0}", msg.Body);//输出消息
17 }
18 //Console.Read();
19 }
20 //Get private queue message
21 if (MessageQueue.Exists(@".\Private$\FrankMSMQ"))//判断私有消息是否存在
22 {
23
24 using (MessageQueue mq = new MessageQueue(@".\Private$\FrankMSMQ"))
25 {
26 mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });//设置消息队列格式化器
27 //mq.Send("Sample Message", ":Label");
28 Message msg = mq.Receive();//接收消息
29 Console.WriteLine("Received MSMQ Private Message is: {0}", msg.Body);//输出消息
30 }
31
32 }
33 Console.Read();
34 }
35 }
36}
37
消息接收同样需要实例化一个消息队列对象, using(MessageQueue mq = new MessageQueue(@".\FrankMSMQ"))负责创建消息队列对象.其次 mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" })这行代码负责设置消息队列的格式化器,因为消息的传递过程中存在格式化的问题.我们接收消息的时候必须指定消息队列的格式化属性Formatter,队列才能接受消息.XmlMessageFormatter的作用是进行消息的XML串行化.BinaryMessageFormatter则把消息格式化为二进制数据进行传输.ActiveXMessageFormatter把消息同样进行二进制格式化,区别是可以使用COM读取队列中的消息.
当然消息队列还可以发送复杂的对象,前提是这个对象要可串行化,具体的格式取决与队列的格式化器设置.此外消息队列还支持事务队列来确保消息只发送一次和发送的顺序.
最近在研究SOA,所以系统系统学习一下WCF及其相关的技术,以上就是这个消息队列的基本的概念和简单的编程实现.下一节是关于.Net Remoting的基础知识和开发的文章.~
我准备把WCF相关的几个知识点都系统整理一下,包括代码的实现.发出来一起与大家交流学习~
(程序代码下载MSMQ_Codes)
WCF分布式开发必备知识系列文章快速学习列表:
WCF分布式开发必备知识系列文章1:MSMQ消息队列
http://www.xueit.com/html/2009-02/21_625_00.html
WCF分布式开发必备知识系列文章2:Net Remoting
http://www.xueit.com/html/2009-02/21_626_00.html
WCF分布式开发必备知识系列文章3:Enterpise Services
http://www.xueit.com/html/2009-02/21_627_00.html
WCF分布式开发必备知识系列文章4:Web Service
http://www.xueit.com/html/2009-02/21_628_00.html