龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

WCF分布式开发必备知识系列文章1:MSMQ消息队列(2)

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
static void Main(string[] args) 2 { 3 //Create a public Queue 4 if (!MessageQueue.Exists(@".FrankMSMQ"))//判断此路径下是否已经有该队列 5 { 6 using (MessageQueue mq = MessageQueue.Create(

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


精彩图集

赞助商链接