C# 操作 MSMQ

简介

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

如同电子邮件相同,消息队列的发送和接收也不必发送者和接收者同时在场,能存储在消息队列或是邮件服务器中。因此,我们能用下图来描述msmq应用程式的体系结构:

从上图能看出,研发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));
将接收到的消息传送给消息变量以后,通过消息变量m的body属性就能读出消息了:
messagebox.show((string)m.body);
关闭消息队列
消息队列的关闭非常简单,和其他对象相同,通过close函数就能实现了:
mq.close();
到此为止,msmq应用程式的基础知识就介绍完全了,不过研发出一个功能强大的msmq应用程式显然不是这么简单,要了解更周详的资料能参考msdn和windows操作系统中关于消息队列的帮助内容。

 

转自:http://www.sudu.cn/info/html/edu/20071226/30265.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值