MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不一样的应用之间实现相互通讯的一种异步传输模式,相互通讯的应用能够分布于同一台机器上,也能够分布于相连的网络空间中的任一位置。它的实现原理是:消息的发送者把本身想要发送的信息放入一个容器中(咱们称之为Message),而后把它保存至一个系统公用空间的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。
在消息传递机制中,有两个比较重要的概念。一个是消息,一个是队列。消息是由通讯的双方所须要传递的信息,它能够是各式各样的媒体,如文本、声音、图象等等。消息最终的理解方式,为消息传递的双方事先商定,这样作的好处是,一是至关于对数据进行了简单的加密,二则采用本身定义的格式能够节省通讯的传递量。消息能够含有发送和接收者的标识,这样只有指定的用户才能看到只传递给他的信息和返回是否操做成功的回执。消息也能够含有时间戳,以便于接收方对某些与时间相关的应用进行处理。消息还能够含有到期时间,它代表若是在指定时间内消息还未到达则做废,这主要应用与时间性关联较为紧密的应用。
消息队列是发送和接收消息的公用存储空间,它能够存在于内存中或者是物理文件中。消息能够以两种方式发送,即快递方式(express)和可恢复模式(recoverable),它们的区别在于,快递方式为了消息的快速传递,把消息放置于内存中,而不放于物理磁盘上,以获取较高的处理能力;可恢复模式在传送过程的每一步骤中,都把消息写入物理磁盘中,以获得较好的故障恢复能力。消息队列能够放置在发送方、接收方所在的机器上,也能够单独放置在另一台机器上。正是因为消息队列在放置方式上的灵活性,造成了消息传送机制的可靠性。当保存消息队列的机器发生故障而从新启动之后,以可恢复模式发送的消息能够恢复到故障发生以前的状态,而以快递方式发送的消息则丢失了。另外一方面,采用消息传递机制,发送方必要再担忧接收方是否启动、是否发生故障等等非必要因素,只要消息成功发送出去,就能够认为处理完成,而实际上对方可能甚至不曾开机,或者实际完成交易时可能已是次日了。
采用MSMQ带来的好处是:因为是异步通讯,不管是发送方仍是接收方都不用等待对方返回成功消息,就能够执行余下的代码,于是大大地提升了事物处理的能力;当信息传送过程当中,信息发送机制具备必定功能的故障恢复能力;MSMQ的消息传递机制使得消息通讯的双方具备不一样的物理平台成为可能。
在微软的.net平台上利用其提供的MSMQ功能,能够轻松建立或者删除消息队列、发送或者接收消息、甚至于对消息队列进行管理。
在.NET产品中,提供了一个MSMQ类库"System.Messaging.dll"。它提供了两个类分别对消息对象和消息队列对象进行操做。在可以使用MSMQ功能以前,你必须肯定你的机器上安装了MSMQ消息队列组件,并确保服务正在运行中。在使用ASP.NET编程时,应在头部使用:
<%@ Assembly Name="System.Messaging"%>
<%@ Import NameSpace="System.Messsaging"%>
将MSMQ类库引入ASP.NET文件
1. 对消息队列的建立
dim MsgQue as MessageQueue
MsgQue=New MessageQueue(MsgPath)
其中:MsgPath能够为本地私有队列,如".\MyQueue",也能够为其余机器的公有队列,如"Saidy\777$\MyQueue",Saidy为另外一机器名。
2. 消息的发送
dim MsgQue as MessageQueue
MsgQue.Send(Msg)
其中:Msg为任一对象。
3. 消息的接收
消息的接收又分红同步和异步方式两种,同步接收在规定时间内从消息队列中取出收到的第一条消息,当消息队列中没有消息时,程序处于等待状态;异步接收方式则是定义了一个事件处理函数,当消息队列中第一个消息到达时当即触发该函数。
1) 同步方式
dim Msg as Message
dim Fmt As XmlMessageFormatter
Fmt= CType(MsgQue.Formatter,XmlMessageFormatter)
Fmt.TargetTypeNames = new String(){"System.String"}
Msg=MsgQue.receive(New TimeSpan(0,0,3))
首先定义收到消息应转换成的格式,而后在指定时间内去接收消息
2) 异步方式
dim Fmt As XmlMessageFormatter
''定义接收消息类型
Fmt = CType(MsgQue.Formatter,XmlMessageFormatter)
Fmt.TargetTypeNames = new String(){"System.String"}
''定义消息处理函数入口
AddHandler MsgQue.ReceiveCompleted, New ReceiveCompletedEventHandler
(AddressOf OnReceiveCompleted)
''定义消息处理函数
Public Shared Sub OnReceiveCompleted(s As Object, asyncResult As ReceiveAsyncEventArgs)
Dim MsgQue As MessageQueue = CType(s,MessageQueue)
Dim Msg As Message = MsgQue.EndReceive(asyncResult.AsyncResult)
''此时Msg.Body即为所取消息对象
MsgQue.BeginReceive()
''从新定义异步接收方式
End sub
''启动异步接收方式
MsgQue.BeginReceive
消息队列配置属性
关于队列的属性
path属性:它能够决定引用队列的三种方式,路径引用、格式名引用、标识引用
category属性:标识当前使用的队列的类型。Category是队列全部者定义的GUID值。该GUID值能够有GUID生成工具产生或者是用户自定义的数字值。GUID值不会惟一,这样才能够根据相同的GUID值,把多个消息队列划分为不一样的类别(category)。
跟发送数据类型相关的属性
Formatter属性:决定在一个队列中如何发送和接收消息的顺序,以及能够在一个消息中发送什么样的内容。
和队列交互相关的属性
DenyShareReceive属性:决定同一时间内只有一个部件可以访问消息队列中的消息。
CanRead和CanWrite属性:决定队列是否能够被读取或者是写入。
MaximumQueueSize和MaximumJournalSize属性:以千字节为单位设置一个队列(日志队列)的消息最大容纳量。一旦接收的消息到达这个容量,新的消息将再也不被接收。
通常状况下,消息队列的最大值为消息队列管理员所设置,若是这个值没有控制的话,那么缺省的消息队列最大容量将是无限制的。
UseJournalQueue属性::设置是否将收到的消息拷贝到日志消息队列中去。web
摘自《MSMQ的简单介绍》http://www.iwms.net/n402c12.aspxexpress