微软消息队列MSMQ.docx

上传人:b****6 文档编号:7869673 上传时间:2023-01-26 格式:DOCX 页数:36 大小:339.88KB
下载 相关 举报
微软消息队列MSMQ.docx_第1页
第1页 / 共36页
微软消息队列MSMQ.docx_第2页
第2页 / 共36页
微软消息队列MSMQ.docx_第3页
第3页 / 共36页
微软消息队列MSMQ.docx_第4页
第4页 / 共36页
微软消息队列MSMQ.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

微软消息队列MSMQ.docx

《微软消息队列MSMQ.docx》由会员分享,可在线阅读,更多相关《微软消息队列MSMQ.docx(36页珍藏版)》请在冰豆网上搜索。

微软消息队列MSMQ.docx

微软消息队列MSMQ

一、MSMQ介绍和安装消息队列

  关于MSMQ详细的介绍请大家向

  使用消息队列的优点:

稳定、消息优先级、脱机能力以及安全性。

  消息队列分为用户创建的队列(专用队列)和系统队列,用户队列分为,。

我是WindowsXP,看下图所示(myQueue为自己创建的消息队列,msmqtriggersnotifiations为通用队列):

  

  对消息队列有了简单的了解后,使用MSMQ进行软件开发需要安装MSMQ,安装完后就该进入实际的开发阶段。

具体的安装过程就是在控制面板里“添加/删除程序”下“添加/删除Windows组件”,完成添加就OK。

安装完成后就可以通过交互界添加新的消息队列,详细如下图:

  

  出了上面这种交互界面来创建MSMQ外,也可以通过编程来完成,.NET框架里的MessageQueue类下有一静态方法Create,用来完成消息队列的创建,其定义如下:

1//

2//摘要:

3//  在指定的路径中创建非事务性“消息队列”队列。

4//

5//参数:

6// path:

7//  要创建的队列的路径。

8//

9//返回结果:

10//  表示新队列的System.Messaging.MessageQueue。

11publicstaticMessageQueueCreate(stringpath);

12//

13//摘要:

14//  在指定的路径中创建事务性或非事务性“消息队列”队列。

15//

16//参数:

17// transactional:

18//  如果创建事务性队列,为true;如果创建非事务性队列,则为false。

19//

20// path:

21//  要创建的队列的路径。

22//

23//返回结果:

24//  表示新队列的System.Messaging.MessageQueue。

25publicstaticMessageQueueCreate(stringpath,booltransactional);

实现消息队列的创建简单代码(C#),创建一个名为"myQueue"的非事务性"消息队列",如下:

  MessageQueue.Create(@".private$myQueue");

  二、创建、删除和管理队列

  在.NET环境下编写MessageQueue程序的前提就是需要先安装MSMQ,本文之前已经作了详细的介绍。

要开发MSMQ程序就必须学习一个很重要的类(MessageQueue),该类位于名称空间System.Messageing下。

其中有几个常用的方法必须掌握:

  --Create方法:

创建使用指定路径的新消息队列。

  --Delete方法:

删除现有的消息队列。

  --Existe方法:

查看指定消息队列是否存在。

  --GetAllMessages()方法:

得到队列中的所有消息。

  --GetPublicQueues方法:

在“消息队列”网络中定位消息队列。

  --Peek/BeginPeek方法:

查看某个特定队列中的消息队列,但不从该队列中移出消息。

  --Receive/BeginReceive方法:

检索指定消息队列中最前面的消息并将其从该队列中移除。

  --Send方法:

发送消息到指定的消息队列。

  --Purge方法:

清空指定队列的消息。

  上述列举的方法在此就不作详细介绍,大家可以通过下面的示例程序中来体会他们各自的功能。

  三、发送和序列化消息

  MSMQ消息队列中定义的消息由一个主体(body)和若干属性构成。

消息的主体可以由文本、二进制构成,根据需要还可以被加密。

在MSMQ中消息的大小不能够超过4MB。

发送消息是通过Send方法来完成的,需要一个Message参数。

  1、发送消息:

  步骤:

连接队列-->指定消息格式-->提供要发送的数据(主体)-->调用Send()方法将消息发送出去。

详细见后面的示例程序。

2、序列化消息:

  消息序列化可以通过.NETFramework附带的三个预定义格式化程序来完成:

  -- XMLMessageFormatter对象----MessageQueue组件的默认格式化程序设置。

  -- BinaryMessageFormatter对象;

  -- ActiveXMessageFormatter对象;

  由于后两者格式化后的消息通常不能为人阅读,所以我们经常用到的是XMLMessageFormatter对象。

该对象构造方法有三种重载:

  1publicXmlMessageFormatter();

  2publicXmlMessageFormatter(string[]targetTypeNames);

  3publicXmlMessageFormatter(Type[]targetTypes);

  如我们后面的示例程序中用到的序列化语句:

  1//序列化为字符串

  2XmlMessageFormatterformatter=newXmlMessageFormatter(newType[]{typeof(string)});

  四、读取和接收消息

  1、读取消息:

  也就是从指定队列中获取消息,详细请查看本文前面的关于消息操作的方法介绍。

  2、接收消息有两种方式:

  -->通过Receive方法--具体功能请返回本文前面有详细介绍。

  -->通过Peek方法--具体功能请返回本文前面有详细介绍。

  五、消息使用实例

  通过上面一系列的介绍,了解了MessageQueue类和常用的方法后,下面我们通过一个简单的示例程序来分析消息队列的创建、发送消息以及接收消息等相关知识点:

  1、通过Create方法创建使用指定路径的新消息队列

1/**////

2///通过Create方法创建使用指定路径的新消息队列

3///

4///

5publicstaticvoidCreatequeue(stringqueuePath)

6{

7  try

8  {

9    if(!

MessageQueue.Exists(queuePath))

10    {

11      MessageQueue.Create(@".private$myQueue");

12    }

13    else

14    {

15      Console.WriteLine(queuePath+"已经存在!

");

16    }

17  }

18  catch(MessageQueueExceptione)

19  {

20    Console.WriteLine(e.Message);

21  }

22}

2、连接消息队列并发送消息到队列

1/**////

2///连接消息队列并发送消息到队列

3///

4publicstaticvoidSendMessage()

5{

6  try

7  {

8    //连接到本地的队列

9    MessageQueuemyQueue=newMessageQueue(".private$myQueue");

10    

11    MessagemyMessage=newMessage();

12    myMessage.Body="消息内容";

13    myMessage.Formatter=newXmlMessageFormatter(newType[]{typeof(string)});

14    //发送消息到队列中

15    myQueue.Send(myMessage);

16  }

17  catch(ArgumentExceptione)

18  {

19    Console.WriteLine(e.Message);

20  }

21}

  3、连接消息队列并从消息队列中接收消息

1/**////

2///连接消息队列并从队列中接收消息

3///

4publicstaticvoidReceiveMessage()

5{

6  //连接到本地队列

7  MessageQueuemyQueue=newMessageQueue(".private$myQueue");

8  myQueue.Formatter=newXmlMessageFormatter(newType[]{typeof(string)});

9  try

10  {

11    //从队列中接收消息

12    MessagemyMessage=myQueue.Receive();

13    stringcontext=(string)myMessage.Body;//获取消息的内容

14    Console.WriteLine("消息内容为:

"+context);

15  }

16  catch(MessageQueueExceptione)

17  {

18    Console.WriteLine(e.Message);

19  }

20  catch(InvalidCastExceptione)

21  {

22    Console.WriteLine(e.Message);

23  }

24}

4、连接队列并清空队列的全部消息

1/**////

2///清空指定队列的消息

3///

4publicstaticvoidClearMessage()

5{

6  MessageQueuemyQueue=newMessageQueue(".private$myQueue");

7  myQueue.Purge();

8}

  5、连接队列并获取队列的全部消息1/**////

2///连接队列并获取队列的全部消息

3///

4publicstaticvoidGetAllMessage()

5{

6  //连接到本地队列

7  MessageQueuemyQueue=newMessageQueue(".private$myQueue");

8  Message[]message=myQueue.GetAllMessages();

9  XmlMessageFormatterformatter=newXmlMessageFormatter(newType[]{typeof(string)});

10  for(inti=0;i

11  {

12    message[i].Formatter=formatter;

13    Console.WriteLine(message[i].Body.ToString());

14  }

15}

  上面依次的列举出来5个方法,这里我就不做测试了。

上述方法全部通过测试的,我在后面提供个连接,没弄清楚的朋友可下载源程序自己去运行调试下。

六、复杂消息发送实例

  通过上面一系列的介绍,对于简单消息的发送和接收及消息的管理应该都不会有什么问题了,下面我在介绍一下关于复杂的消息处理,现在有这样一个需求,要求通过消息队列将一本图书信息发送到队列里,然后从消息队列里读取出来。

图书的基本信息包括图书编号、图书名称、图书作者以及图书定价,这样的一个复杂的对象类型怎么来传输呢?

详细如下:

  Book对象

1namespaceMSMQ.App

2{

3  publicclassBook

4  {

5    privateint_BookId;

6    publicintBookId

7    {

8      get{return_BookId;}

9      set{_BookId=value;}

10    }

11

12    privatestring_BookName;

13    publicstringBookName

14    {

15      get{return_BookName;}

16      set{_BookName=value;}

17    }

18

19    privatestring_BookAuthor;

20    publicstringBookAuthor

21    {

22      get{return_BookAuthor;}

23      set{_BookAuthor=value;}

24    }

25

26    privatedouble_BookPrice;

27    publicdoubleBookPrice

28    {

29      get{return_BookPrice;}

30      set{_BookPrice=value;}

31    }

32  }

33}

  

1namespaceMSMQ.App

2{

3  publicclassMsgQueue

4  {

5    /**////

6    ///通过Create方法创建使用指定路径的新消息队列

7    ///

8    ///

9    publicstaticvoidCreatequeue(stringqueuePath)

10    {

11      try

12      {

13        if(!

MessageQueue.Exists(queuePath))

14        {

15          MessageQueue.Create(@".private$myQueue");

16          MessageBox.Show("创建队列成功!

");

17        }

18        else

19        {

20          MessageBox.Show(queuePath+"已经存在!

");

21        }

22      }

23      catch(MessageQueueExceptione)

24      {

25        MessageBox.Show(e.Message);

26      }

27    }

28

29    /**////

30    ///连接消息队列并发送消息到队列

31    ///

32    publicstaticboolSendMessage(Bookbook)

33    {

34      boolflag=false;

35      try

36      {

37        //连接到本地的队列

38        MessageQueuemyQueue=newMessageQueue(".private$myQueue");

39

40        System.Messaging.MessagemyMessage=newSystem.Messaging.Message();

41        myMessage.Body=book;

42        myMessage.Formatter=newXmlMessageFormatter(newType[]{typeof(MSMQ.App.Book)});

43        //发送消息到队列中

44        myQueue.Send(myMessage);

45        flag=true;

46      }

47      catch(ArgumentExceptione)

48      {

49        MessageBox.Show(e.Message);

50      }

51      returnflag;

52    }

53

54    /**////

55    ///连接消息队列并从队列中接收消息

56    ///

57    publicstaticstringReceiveMessage()

58    {

59      //连接到本地队列

60      MessageQueuemyQueue=newMessageQueue(".private$myQueue");

61      myQueue.Formatter=newXmlMessageFormatter(newType[]{typeof(MSMQ.App.Book)});

62      try

63      {

64        //从队列中接收消息

65        System.Messaging.MessagemyMessage=myQueue.Receive();

66        Bookbook=(Book)myMessage.Body;//获取消息的内容

67        returnstring.Format("编号:

{0},书名:

{1},作者:

{2},定价:

{3}",

68          book.BookId,

69          book.BookName,

70          book.BookAuthor,

71          book.BookPrice);

72      }

73      catch(MessageQueueExceptione)

74      {

75        MessageBox.Show(e.Message);

76      }

77      catch(InvalidCastExceptione)

78      {

79        MessageBox.Show(e.Message);

80      }

81      returnnull;

82    }

83  }

84}

  其实发送复杂的消息也就是在消息序列化上有些差别,别的地方与发送普通文本消息没什么大的变化,上面类里提供了创建队列,发送消息到队列,从队列获取消息三个方法,测试结果如下:

  

  上示例中,完成了一个复杂类型的消息发送到队列及从队列中读取的演义

窗体底端

ASP.NET中进行消息处理(MSMQ)二

2008-07-0107:

07作者:

beniao出处:

天极网责任编辑:

nancy

  本文继续介绍MSMQ的相关知识点,通过一个示例程序来分析MSMQ在实际项目开发中的应用。

  建议:

如果你对MSMQ不够了解,在你阅读本文前请先阅读第一部分:

《ASP.NET中进行消息处理(MSMQ)一》。

  一、消息传递的优先级

  在MSMQ中消息在队列里传输是分有优先级的,这里我就以实例的形式介绍下关于优先级的使用,优先级一共有七种,MessagePriority枚举里全部进行了封装。

因这里只作程序演示就不一一列举出,仅用了Highest和Normal两种类型,关于消息队列上进行消息传输的七种优先级大家可以参考我下面提供的MessagePriority枚举源代码定义。

  那么在发送消息的时候怎么指定消息的优先级呢?

在Message对象里封装有一个属性Priority,接受一个枚举MessagePriority类型的值来设置消息传输的优先级。

如下:

1System.Messaging.Message message = new System.Messaging.Message();

2message.Priority = MessagePriority.Highest; //最高消息优先级

  下面来看看一个在消息传输中使用优先级的示例程序,通过示例程序会学习得更明白。

示例程序界面:

  

  根据界面可知,提供了消息名字,消息优先级和消息内容三个输入项,前面曾经说过,这里为了方便演示就仅用了Highest和Normal两种类型,当点击发送消息的时候就通过是否选择优先级来设置消息的优先级,代码如下:

 

1private void btnSend_Click(object sender, EventArgs e)

2{

3 //连接到本地的专用队列myQueue

4 MessageQueue myQueue = new MessageQueue(".\\private$\\myQueue");

5 System.Messaging.Message message = new System.Messaging.Message();

6 message.Label = tbName.Text;

7 message.Body = tbContext.Text;

8

9 if (cbPriority.Checked)

10 {

11 message.Priority = MessagePriority.Highest;

12 }

13 else

14 {

15 message.Priority = MessagePriority.Normal;

16 }

17 myQueue.Send(message);

18 MessageBox.Show("成功发送消息到队列");

19}

    这里我们可以向队列里发送两条消息,以便后面测试读取方法,发送两条消息到队列,此时,从队列消息中可以看到:

  "刷新队列"实质上就是把队列里的消息全部读取出来,具体的实现在《ASP.NET中进行消息处理(MSMQ)一》里已经作了详细的介绍,这里就不在多说,看看下面的代码:

 

     1private void DisplayMessage()

  2 {

  3 //连接到本地队列

  4 MessageQueue myQueue = new MessageQueue(".\\private$\\myQueue");

  5 myQueue.MessageReadPropertyFilter.Priority = true;

  6 DataTable messageTable = new DataTable();

  7 messageTable.Columns.Add("名字");

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1