msmq消息队列安装,mq消息队列代码

msmq消息队列安装,mq消息队列代码,MSMQ微软消息队列详解

本文详细解释了MSMQ微软消息队列,并通过示例代码对其进行了详细介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。

一、引言

windows Communication Foundation(WCF)是由微软提供的用于构建面向服务的应用程序的统一编程模型。服务模型提供支持松散耦合和版本管理的序列化功能,并提供与微软现有的分布式系统技术,如消息队列(MSMQ)、COM、Asp.net Web服务和。NET远程处理。使用WCF平台,开发人员可以轻松构建面向服务的应用程序(SOA)。可以认为WCF是现有分布式技术(指MSMQ等技术)的集成和延伸。NET远程处理和Web服务)。在这种情况下,我们有必要先了解之前的分布式技术,只有这样,我们才能更深入地了解WCF带来的好处。今天让我们分享一下MSMQ,一种分布式技术。

二、MSMQ的介绍

MSMQ的全称是微软消息队列——微软消息队列。它是一种异步传输方式,可以实现不同应用之间的相互通信。相互通信的应用程序可以分布在同一台机器上或连接的网络空间中的任何地方。

2.1 MSMQ 工作原理

MSMQ的实现原理是:消息的发送方把他要发送的信息放入一个容器中,然后保存到系统公共空间的一个消息队列中,本地或远程的消息接收方从队列中取出发送给它的消息进行处理。

消息队列是一个公共存储空间,它可以存在于内存或物理文件中。因此,消息以两种方式发送,即快递和可恢复模式。它们之间的区别是消息存储的位置,快递,所以消息放在内存而不是物理磁盘,以获得更高的处理能力;在可恢复模式下,消息在传输过程的每一步都被写入物理磁盘,这样当存储消息队列的机器出现故障重启时,发送的消息可以恢复到传输失败前的状态,从而获得更好的消息恢复能力。消息队列可以放在发送方和接收方所在的机器上,也可以单独放在另一台机器上。此外,通过采用消息队列机制,发送方不必担心接收方是否启动或失败等因素。只要消息发送成功,就可以认为处理完成,但实际上对方可能连开机都没有,也可能第二天就把实际消息送达对方。MSMQ机制类似于QQ消息机制。下图演示了MSMQ的实现原理。

在MSMQ有两个主要的概念。

一个是消息:消息是双方需要传递的消息。可以是文字、图片、视频等。消息包含发送方和接收方的身份,只有指定的用户才能获取消息。一个是队列:用于存储消息的存储空间。MSMQ主要包括以下类型的队列:公共队列(public queue):在整个消息队列网络中复制,并且可以被连接到网络的所有站点访问。路径格式为:机器名\队列名专用队列(或私有队列):不在全网发布,它们只在驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。路径的格式为:机器名\私有$\队列名日志队列:包含在给定消息队列中发送的消息确认消息。路径格式为:机器名\队列名\Journal$ Response Queue:包含目标应用收到消息时返回给发送应用的响应消息,包括机器日志队列、机器死信队列和机器事务死信队列。机器日志队列的格式为:机器名\日志$;机器死信队列的格式为:机器名\死信$;机器通道死信队列的格式为:机器名\ xactdeaddletter $。

2.2 队列引用说明

创建MessageQueue的实例后,您应该指示要与哪个队列进行通信。有三种方法可以访问中指定的消息队列。网络:

使用路径,消息队列的路径由机器名和队列名唯一确定,因此消息队列路径可用于指示所使用的消息队列。使用格式名,这是创建消息队列时由MSMQ生成的唯一标识符。任务不是由用户指定的,而是由队列管理器自动生成的GUID。使用识别名(标签),这是创建消息队列时由消息管理器指定的有意义的名称。

三、消息队列的优缺点

采用消息队列的优点是:由于异步通信,发送方和接收方都可以在等待对方成功消息时执行剩余的代码,大大提高了处理能力;在信息传输过程中,具有故障恢复能力;MSMQ的消息传递机制使得通信双方拥有不同的物理平台成为可能。

消息队列的缺点是不适合客户端和服务器的实时交互,大量请求时响应可能会延迟。

四、利用MSMQ开发分布式应用

4.1 环境准备

发展MSMQ。NET平台,需要安装消息队列。您需要打开控制面板-程序-打开或关闭Windows功能,并检查消息队列服务的所有选项。具体操作如下图所示:

检查完毕,点击确定,在我的电脑-管理-服务和应用-消息队列中可以看到下图:

看到上图说明你已经成功配置了MSMQ的开发环境,那么你就可以使用Visual Studio进行开发了。注意,对于特定类型队列的操作码,必须成功安装对应的队列类型。

4.2 使用MSMQ开发分布式应用

首先,实现服务器端。创建一个控制台项目并添加一个对System的引用。消息传递,因为所有类的消息队列都封装在System.Messaging.dll程序集中。服务器的具体代码如下:

使用系统;

使用系统。消息传递;

命名空间MSMQServer

{

班级计划

{

静态void Main(string[] args)

{

//创建一个公共队列,只能在域环境中创建。

//如果(!Messagequeue.exists (@)。\ learninghardsmq '))//确定队列是否已经存在于此路径中。

//{

//使用(MessageQueue mq=MessageQueue。创建(@)。\ LearningHardMSMQ '))

//{

//mq。Label=' LearningHardQueue//设置队列标签

//控制台。WriteLine(“已创建公共队列”);

//控制台。WriteLine('路径为:{0} ',mq。路径);

//控制台。WriteLine('队列名称为:{0} ',mq。queue name);

//mq。发(‘MSMQ留言’,‘倾尽全力’);//发送消息

//}

//}

//if (MessageQueue。存在(@)。\ Private $ \ LearningHardMSMQ '))

//{

//删除消息队列

//MessageQueue。删除(@)。\ Private $ \ learninghardsmq ');

//}

//创建私有消息队列

如果(!消息队列。存在(@)。\ Private $ \ LearningHardMSMQ '))

{

使用(MessageQueue mq=MessageQueue。创建(@)。\ Private $ \ LearningHardMSMQ '))

{

mq。label=' LearningHardPrivateQueue ';

控制台。WriteLine(“已创建私有队列”);

控制台。WriteLine('路径为:{0} ',mq。路径);

控制台。WriteLine('专用队列名称为:{0} ',mq。queue name);

mq。发送(' MSMQ私信','倾尽全力');//发送消息

}

}

//遍历所有公共消息队列

//foreach (MessageQueue中的MessageQueue mq。GetPublicQueues())

//{

//mq。发送('发送MSMQ公共消息'日期时间。Now.ToLongDateString(),'努力学习');

//控制台。WriteLine(“公共消息发送到{0}”),mq。路径);

//}

if (MessageQueue。存在(@)。\ Private $ \ LearningHardMSMQ '))

{

//获取私有消息队列

MessageQueue mq=新消息队列(@)。\ Private $ \ learninghardsmq ');

mq。发送('发送MSMQ私人消息'日期时间。Now.ToLongDateString(),'倾尽全力');

控制台。WriteLine(“私人消息发送到{0}”),mq。路径);

}

控制台。read();

}

}

}

应该注意,在服务器代码中,公共队列只能在域环境中创建。因为我的个人计算机没有加入域环境,所以无法创建它。从启动消息队列的截图可以看出,图中没有安装公共队列。

实现了服务器端,自然就完成了客户端。MSMQ程序的原理是:服务器将消息发送到共享消息队列,然后客户端从共享消息队列中取出消息进行处理。客户端的具体实现代码如下:

使用系统;

使用系统。消息传递;//你需要添加一个系统。消息传递参考

命名空间MSMQClient

{

班级计划

{

静态void Main(string[] args)

{

if (MessageQueue。存在(@)。\ Private $ \ LearningHardMSMQ '))

{

//创建消息队列对象

使用(message queue MQ=new message queue(@ '。\ Private $ \ LearningHardMSMQ '))

{

//设置消息队列的格式化程序

mq。formatter=new XmlMessageFormatter(new string[]{ ' System。字符串' });

foreach(MQ中的消息msg。GetAllMessages())

{

控制台。WriteLine('收到的私人消息是:{0} ',msg。体);

}

消息firstmsg=mq。receive();//获取消息队列中的第一条消息

控制台。WriteLine('收到的第一条私信是:{0} ',firstmsg。体);

}

}

控制台。read();

}

}

}

4.3 运行演示

经过以上步骤,我们完成了MSMQ分布式程序的实现。让我们看看如何运行程序来看效果。

首先,启动服务器是很自然的。右键单击MSMQServer Project-Debug-Start a new instance来启动服务器。具体步骤如下图所示:

成功操作后,您将在成功控制台界面上向服务器发送一条消息。效果图如下:

接下来,运行客户机从消息队列中获取消息,并在控制台中显示它。以与服务器相同的方式启动客户端。右键msmq client-Debug-Start a new instance,看到客户端的效果如下图所示:

从上图可以看出,客户端确实成功地获取了消息队列中的消息。

上面的MSMQ程序需要特别注意:MessageQueue。Receive()取出消息队列中的第一条消息,将其从消息队列中删除(中文翻译MSDN是错的,MSDN说不要删除,英文原文是要删除),实际结果也是删除。如果再次运行客户端,会发现消息队列中只有一条消息。具体运行效果如下图所示:

五、总结

至此,MSMQ的内容分享结束,MSMQ的实现原理也很简单。总之,服务器把消息放在一个公共的地方,叫做消息队列,其他客户端可以从这个地方取出消息进行处理。下一章将分享——.NET远程处理,另一种分布式技术。NET平台。

本文的示例代码文件:MSMQSample。

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: