MicroSoft Message Queuing
(微软消息队列)是在多个不一样的应用之间实现相互通讯的一种异步传输模式
,相互通讯的应用能够分布于同一台机器上,也能够分布于相连的网络空间中的任一位置。它的实现原理是:消息的发送者把本身想要发送的信息放入一个容器中(咱们称之为Message),而后把它保存至一个系统公用空间的消息队列(Message Queue)
中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。html
在消息传递机制
中,有两个比较重要的概念。一个是消息
,一个是队列
。消息是由通讯的双方所须要传递的信息,它能够是各式各样的媒体,如文本、声音、图象等等。消息最终的理解方式,为消息传递的双方事先商定,这样作的好处是,一是至关于对数据进行了简单的加密,二则采用本身定义的格式能够节省通讯的传递量。消息能够含有发送和接收者的标识,这样只有指定的用户才能看到只传递给他的信息和返回是否操做成功的回执。消息也能够含有时间戳,以便于接收方对某些与时间相关的应用进行处理。消息还能够含有到期时间,它代表若是在指定时间内消息还未到达则做废,这主要应用与时间性关联较为紧密的应用。express
消息队列是发送和接收消息的公用存储空间
,它能够存在于内存中
或者是物理文件中
。消息能够以两种方式发送,即快递方式(express)
和可恢复模式(recoverable)
,它们的区别在于,快递方式为了消息的快速传递,把消息放置于内存中,而不放于物理磁盘上,以获取较高的处理能力;可恢复模式在传送过程的每一步骤中,都把消息写入物理磁盘中,以获得较好的故障恢复能力。消息队列能够放置在发送方、接收方所在的机器上,也能够单独放置在另一台机器上。正是因为消息队列在放置方式上的灵活性,造成了消息传送机制的可靠性。当保存消息队列的机器发生故障而从新启动之后,以可恢复模式发送的消息能够恢复到故障发生以前的状态,而以快递方式发送的消息则丢失了。另外一方面,采用消息传递机制,发送方没必要要再担忧接收方是否启动、是否发生故障等等非必要因素,只要消息成功发送出去,就能够认为处理完成,而实际上对方可能甚至不曾开机,或者实际完成交易时可能已是次日了安全
采用MSMQ带来的好处是:因为是异步通讯
,不管是发送方仍是接收方都不用等待对方返回成功消息,就能够执行余下的代码,于是大大地提升了事物处理的能力;当信息传送过程当中,信息发送机制具备必定功能的故障恢复能力;MSMQ的消息传递机制使得消息通讯的双方具备不一样的物理平台成为可能。服务器
在微软的.net平台上利用其提供的MSMQ功能,能够轻松建立或者删除消息队列、发送或者接收消息、甚至于对消息队列进行管理。网络
在Net操做MSMQ 咱们得使用MessageQueue
类(它在system.messaging.dll这个程序集中),经过它提供的API来管理MSMQ队列.异步
建立队列,path表明队列的路径,transactional表示是否建立事务队列,默认为fasle。工具
public static MessageQueue Create(string path);
public static MessageQueue Create(string path, bool transactional);
验证指定路径的队列是否存在,path表明队列的路径,表现形式为"主机名\队列名称"。ui
例如:".\private$\myQueue",其中".“表明本地主机,”\private$\myQueue"则表明队列的名称,"private$"表示咱们建立的是专用队列,在网络上咱们能够经过路径来惟一肯定一个队列。加密
public static bool Exists(string path);
删除队列,path表明队列的路径。操作系统
public static void Delete(string path);
发送消息到MSMQ。obj表明咱们的用户数据,transation表示将咱们的发送操做归入事务当中。
在前面咱们说过MSMQ接收的是Message,可是在这里咱们看到Send操做并未强制要求咱们采用Message类型参数。这是由于当我传入一个Object参数数据时,在Send操做的内部自动的给咱们建立了一个Message消息对象,而且将咱们的传入的Object参数采用默认的序列化器序列化,而后装入Message的body属性当中,若是咱们在Send方法中指定label属性,它将被赋值给Message的同名Label属性。固然咱们彻底能够自定义一个message对象传入Send方法中
public void Send(object obj);
public void Send(object obj, MessageQueueTransaction transaction);
public void Send(object obj, string label);
若是咱们在接收消息的后,不想把MSMQ队列中的消息删除怎么办呢?那么采用下面的方法吧,由于这两个方法接收MSMQ的消息,不会删除MSMQ中对应的消息,因此他们不支持事务,即没有提供事务的参数。
public Message Peek();
若是咱们想取指定标识的消息,就的采用以下的方法了,id表明消息的惟一标示
public Message PeekById(string id);
采用Receive方式在取MSMQ的消息时,若是成功,会把MSMQ的对应消息给删除掉,而且只能取到消息队里中的排队头的消息。
public Message Receive();
public Message Receive(MessageQueueTransaction transaction);
public Message Receive(TimeSpan timeout);
若是咱们想取指定标识的消息,就的采用以下的方法了,id表明消息的惟一标示。
public Message ReceiveById(string id);
public Message ReceiveById(string id, MessageQueueTransaction transaction);
咱们可使用GetAllMessages一次性把队列里面的全部消息取出来
public Message[] GetAllMessages();
本次将使用win10系统自带的MSMQ进行演练,首先若是你使用的是Windows操做系统(不论是Windows Server、Windows Vista仍是Windows 10,Windows 7,Windows 8等)均可以在无需下载的状况下安装微软提供MSMQ服务,相信不少微软用户对此比较熟悉。
打开 控制面板>程序>程序和功能>启动或关闭Windows功能
选择 MicroSoft Message Queue(MSMQ)服务器
点击肯定等待安装完成
打开 控制面板>系统和安全>管理工具>计算机管理
咱们能够看到在服务和应用程序中有一个消息队列
,打开消息队列咱们能够看到服务自己为咱们提供了3中队列(传出队列、专用队列、系统队列)。
在上面的三种队列中,用户能自由建立的只有专用队列,下面演示建立一个专用队列。
相关