使用C#和MSMQ开发消息处理程序

原创 2004年03月20日 14:37:00

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

简介

 

         MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式、松散连接的消息通讯应用程序的开发工具。消息队列和电子邮件有着很多相似处,他们都包含多个属性,用于保存消息,消息类型中都指出发送者和接收者的地址;然而他们的用处却有着很大的区别:消息队列的发送者和接收者是应用程序,而电子邮件的发送者和接收者通常是人。

 

如同电子邮件一样,消息队列的发送和接收也不需要发送者和接收者同时在场,可以存储在消息队列或是邮件服务器中。因此,我们可以用下图来描述MSMQ应用程序的体系结构:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

         从上图可以看出,开发MSMQ应用程序并不是十分困难的事情。不过要使用MSMQ开发你的消息处理程序,必须在开发系统和使用程序的主机上安装消息队列。消息队列的安装属于Windows组件的安装,和一般的组件安装方法类似。安装好消息队列后,就可以开发你自己的消息处理程序了。不过有一点需要注意,如果你的计算机处于工作组中,而不是某个域中,可能你的公用队列不能使用,不过这并不影响你的程序开发。

 

         消息处理程序不外乎消息的发送和接收,然而要收发消息,还必须引用一个队列,通常我们引用公用队列和专用队列,这两个队列都存放用户生成的消息。引用队列后,就可以发送、接收和阅读消息了。消息接收服务位于System.Messaging中,如果你找不到这一命名空间,你必须手动添加。点击[项目]中的[添加引用],按下浏览按钮,找到System.Messaging.dll文件,添加进来即可。

 

引用队列

 

         引用队列有三种方法,通过路径、格式名和标签引用队列,这里我只介绍最简单和最常用的方法:通过路径应用队列。队列路径的形式为 machinename/queuename。指向队列的路径总是唯一的。下表列出用于每种类型的队列的路径信息:

        

队列类型

路径中使用的语法

公共队列

MachineName/QueueName

专用队列

MachineName/Private$/QueueName

日志队列

MachineName/QueueName/Journal$

        

如果是发送到本机上,还可以使用”.”代表本机名称。具体的引用方法通过Path属性来进行,也可以在初始化消息队列时进行。

 

如果在初始化时引用消息队列,那么消息队列必须存在于系统中,否则会产生中断。往系统中添加队列十分的简单,打开[控制面板]中的[计算机管理],展开[服务和应用程序],找到并展开[消息队列](如果找不到,说明你还没有安装消息队列),右击希望添加的消息队列的类别,选择新建队列即可。当然,在程序中也可以实现消息队列的创建,下文会有相应的说明。在初始化时引用消息队列的代码很简单,如下所示:

 

MessageQueue Mq=new MessageQueue(“.//private$//jiang”)

通过Path属性引用消息队列的代码也十分简单:

MessageQueue Mq=new MessageQueue()

Mq.Path=”.//private$//jiang”;

使用 Create 方法可以在计算机上创建队列:

System.Messaging.MessageQueue.Create(@"./private$/jiang");

 

发送消息

 

         队列引用过后,就可以发送消息了。消息的发送可以分为简单消息和复杂消息,简单消息类型就是常用的数据类型,例如整型、字符串等数据;复杂消息的数据类型通常对应于系统中的复杂数据类型,例如结构,对象等等。

 

         简单消息的发送示例如下:

         Mq.Send(1000); //发送整型数据

         Mq.Send(“This is a test message!”); //发送字符串

 

         复杂消息的发送和简单消息的发送大同小异,只是发送时,通常不是直接给出发送的消息内容,而是代表发送消息内容的变量。下面的代码分别通过消息变量和复杂数据类型变量发送一条复杂消息。

 

         //下面的代码中发送的消息由消息变量表示

         Message Msg;

         Msg=new Message(“A Complex Message!”);

         Msg.Label=”This is the label”;

         Msg.Priority=MessagePriority.High;

         Mq.Send(Msg);

 

         //下面的代码中发送的消息由复杂数据类型变量表示,Customer为自定义的一个类

          Customer customer = new Customer();

    customer.LastName = "Copernicus";

    customer.FirstName = "Nicolaus";       

Mq.Send(customer);

 

接收消息

 

       接收消息相比发送消息要复杂一点。接收消息由两种方式:通过Receive方法接收消息同时永久性地从队列中删除消息;通过Peek方法从队列中取出消息而不从队列中移除该消息。如果知道消息的标识符(ID),还可以通过ReceiveById方法和PeekById方法完成相应的操作。

 

         接收消息的代码很简单:

         Mq.Receive(); //Mq.ReceiveById(ID);

         Mq.Peek();  // Mq.PeekById(ID);

 

阅读消息

 

         接收到的消息只有能够读出来才是有用的消息,因此接收到消息以后还必须能读出消息,而读出消息算是最复杂的一部操作了。在应用程序能够阅读的消息和消息队列中的消息格式不同,因而应用程序发送出去的消息经过序列化以后才发送给了消息队列,这一过程由系统自动完成了,程序开发人员不必为此编写代码,然而在接收到消息后就面临着消息序列化的问题。

 

         消息的序列化可以通过Visual Studio .NET Framework 附带的三个预定义的格式化程序来完成:XMLMessageFormatter 对象( MessageQueue 组件的默认格式化程序设置)、BinaryMessageFormatter 对象、ActiveXMessageFormatter 对象。由于后两者格式化后的消息通常不能为人阅读,所以我们经常用到的是XMLMessageFormatter对象。

 

         使用XMLMessageFormatter对象格式化消息的代码如下所示:

          string[] types = { "System.String" };

       ((XmlMessageFormatter)mq.Formatter).TargetTypeNames = types;

              Message m=mq.Receive(new TimeSpan(0,0,3));

       mBody

       MessageBox.Show((string)m.Body);

       Close

       Mq.Close();

         到此为止,MSMQ应用程序的基础知识就介绍完全了,但是开发出一个功能强大的MSMQ应用程序显然不是这么简单,要了解更详细的资料可以参考MSDNWindows操作系统中关于消息队列的帮助内容。

 

C#操作MSMQ向本地消息队列发送和接收消息

注意:不管是访问远程队列还是本地队列,访问者的本地系统一定要安装MSMQ。 下面是在C#项目环境下操作MSMQ向本地发送和接收消息的示例代码: using System; using System.M...
  • iFuMI
  • iFuMI
  • 2016年07月17日 14:56
  • 4134

MSMQ 创建发送接收队例消息

MSMQ,微软消息队列。   一、MSMQ介绍和安装消息队列   使用消息队列的优点:稳定、消息优先级、脱机能力以及安全性。   消息队列分为用户创建的队列(专用队列)和系统队列,看下图所示(m...
  • fhzh520
  • fhzh520
  • 2014年12月16日 13:37
  • 1183

MSMQ-发送消息到远程专用队列path格式

在工作组模式下,远程访问专用队列。在网上找到一篇文章,翻译了一下。 最后结论,直接使用多元素格式名方式,利用IP地址直接对单个或多个目标发送消息      MessageQueue rmQ...
  • CsethCRM
  • CsethCRM
  • 2014年04月14日 13:23
  • 3375

第25周-window程序设计(基础篇)-第4章-SYSMETS.C窗口消息处理程序

1、SYSMETS.C: /*SYSMETS.C——System Metrics Display Program No.1*/ #include #include"sysmets.h" LRESUL...
  • Emperor_21AD_ShiDi
  • Emperor_21AD_ShiDi
  • 2016年09月21日 16:59
  • 577

JMS 传输和 SOAP 消息处理程序

通常情况下,客户端应用程序在调用 WebLogic Web Service 时使用 HTTP/S 作为连接协议。但是,您可以对 WebLogic Web Service 进行配置,以便客户端应用程序可...
  • lrwin
  • lrwin
  • 2011年03月29日 17:07
  • 1198

不调用与 PostThreadMessage() PRB: MFC 消息处理程序

不调用与 PostThreadMessage() PRB: MFC 消息处理程序 点击这里查看逐句中英文对照机器翻译 查看机器翻译免责声明 不再更新的 KB 内容免责声明 查看本文应用于的...
  • lionzl
  • lionzl
  • 2012年02月12日 15:41
  • 483

第25周-window程序设计(基础篇)-第3章-窗口消息处理程序WndProc

1、窗口消息处理程序WindowProc: /*窗口消息处理程序定义*/ LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,L...
  • Emperor_21AD_ShiDi
  • Emperor_21AD_ShiDi
  • 2016年09月20日 22:14
  • 329

visual c#图像处理程序实例

  • 2008年07月10日 23:50
  • 8.95MB
  • 下载

visual c#图像处理程序实例

  • 2008年07月07日 20:20
  • 8.48MB
  • 下载

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

MSMQ是微软消息队列的英文缩写。那么什么是消息队列?这些介绍网上一大片这里就不多说了。本文对于大虾级的人物来说这只是小玩意而已,对于初学者来说这文章还是有一定的帮助,希望路过的大虾们别笑话我班门弄斧...
  • skydxd
  • skydxd
  • 2013年03月31日 18:27
  • 751
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用C#和MSMQ开发消息处理程序
举报原因:
原因补充:

(最多只允许输入30个字)