.NET中的消息队列
下文参考:http://hi.baidu.com/21tian/blog/item/ce5464097ddf10cb3ac76335.html
为何使用消息队列
您可能认为您能够通过一个简单的数据库表(一个应用程序往其中写入数据,另一个应用程序从中读取数据)来应用消息队列。消息队列平台更为稳定,因为它们通常拥有自己的安全机制、事务支持及其它功能。传输消息的路由功能是它的一个关键应用。MSMQ提供各种消息队列平台。
MSMQ简介
MSMQ是Windows 2000、Windows XP、Windows Server 2003的一个组件,并将继续包含在Windows Vista和以后的Windows服务器中。即使目标接收应用程序没有运行,或运行发送或接收应用程序的计算机没有联网,协同合作的应用程序仍能利用MSMQ在彼此之间发送和接收消息。在到达目标队列之前,消息由MSMQ存储并转发。接收应用程序能够从队列中恢复数据。
MSMQ之类消息队列的主要特点在于它分离发送和接收应用程序,使其不必同时运行。这意味着一个应用程序能够把数据存放在队列中,而不用理会队列中的项目是否被传送到接收应用程序。
MSMQ是Windows的一个可选组件,只需通过Windows控制面板的添加或删除Windows组件向导就可进行安装。MSMQ有两种配置模式:域模式或工作组模式(只使用私有队列)。MSMQ安装完成后,立即就可以在.NET应用程序中运行。
MSMQ交互
开发基于消息的应用程序从队列开始。MSMQ包含四种队列类型:
- 外发队列:消息发送到目的地之前,用它来临时存储消息。
- 公共队列:在主动目录中公布。整个网络各种服务器上的应用程序能够通过主动目录找到并应用公共队列。
- 私有队列:这些是本地服务器上的队列,对其它服务器无效(因此这些队列不在主动目录中公布。)
- 系统队列:包含日记队列(由系统生成)、死队列和事务型死信队列。死消息无法传送。
System.Messaging命名空间执行MSMQ的编程操作。这个命名空间有两个主要的对象:
- Message:队列发送或读取的实际消息或数据。
- MessageQueue:接收/发送消息的MSMQ消息队列。
MSMQ编程
建立一个队列是应用MSMQ的第一步。您可以通过Windows计算机管理控制台中的消息队列选项完成这一操作,或者自己编程建立一个队列。列表A中的C#代码建立了一个新的私有MSMQ消息队列(如果不存在队列),并同时创建一条消息。
代码应用MessageQueue类的Exists方法来确定是否存在一个名为TechRepublic的私有队列。如存在,它用现有队列示例这个MessageQueue对象;否则,就建立一个新队列。
新的Message对象用来向队列发送一条消息。它的Label属性指定在MSMQ控制台中显示的消息标题,其主体包含存放在队列上的项目内容。在这种情况下,我只发送文本,但您能够使用任何类型的对象。MessageQueue类的Send方法向队列发送消息。列表B中是对应的VB.NET代码。
下一步即从队列中读取消息。这是一个简单的过程,应用MessageQueue类的Receive方法即可。如果队列中存在消息,Receive方法就返回一个消息对象;否则,它等待一条消息出现(您可以设置一个时间期限)。从队列中恢复对象需要预先知道它的类型。
MessageQueue类的Formatter属性允许您轻松指定被恢复对象的类型。下面的简单例子仅使用文本,所以它应用System.String。在列表C中,C#代码从测试队列中读取消息。
提交给Receive方法的TimeSpan对象指定异常出现时系统的等待时间。接下来设置这个例子中的Formatter方法,对象被转换成字符串读取前面存储的文本。Receive方法从队列中读取消息,它的值显示在控制台中。在try块的最后部分,队列关闭。
轻松应用消息
MSMQ组合Windows和.NET的System.Messaging命名空间,使您可以方便地在.NET应用程序中利用消息。消息提供一种在企业应用程序中异步发送并接收消息(数据)的强大工具。
以下试文章来源
http://hi.baidu.com/sanlng/blog/item/5fc5bb510d4faa2043a75b28.html
三、发送信息
1、发送简单消息
在消息发送前,首先要实例化MessageQueue的一个实例并指定其所对应的队列。如下代码
//实例化MessageQueue,并指向现有的一个名称为VideoQueue队列
MessageQueue MQ = new MessageQueue(@".\private$\VideoQueue");
MQ.Send("消息测试","测试消息");
2、发送复杂消息
VideoPath是将要被当作消息的Boby来进行传递的类型,其定义如下:
using System;
namespace Message.Bussiness
{
[Serializable]
public class VideoPath
{
string _sourceFilePath = string.Empty;
string _targetFilePath = string.Empty;
public VideoPath()
{
}
public VideoPath(string sourceFilePath,string targetFilePath)
{
this._sourceFilePath = sourceFilePath;
this._targetFilePath = targetFilePath;
}
public string SourceFilePath
{
get
{
return this._sourceFilePath;
}
set
{
this._sourceFilePath= value;
}
}
public string TargetFilePath
{
get
{
return this._targetFilePath;
}
set
{
this._targetFilePath = value;
}
}
}
}
对该类的要求是,该类必须要有一个默认无参的公共构造函数,所有属性必须是可读写的,且该类必须可以被序列化。利用Message将消息发送到队列中。
MessageQueue MQ = new MessageQueue(@".\private$\VideoQueue");
VideoPath VPath = new VideoPath(Path.Combine(Server.MapPath("."),"Video\\output.wmv"),Path.Combine(Server.MapPath("."),"Flv\\output.flv"));
System.Messaging.Message message = new System.Messaging.Message();
message.Label = "视频转换所用消息";
message.Body = VPath;
MQ.Send(message);
四、接收消息
1、接收简单类型的消息
2、接收复杂类型的消息
对于“代码片断3”所示的消息,在接收时可按如下方法:
MessageQueue MQ = new MessageQueue(@".\private$\VideoQueue");
//调用MessageQueue的Receive方法接收消息
System.Messaging.Message message = MQ.Receive( TimeSpan.FromSeconds(5));
if ( message != null )
{
message.Formatter = new System.Messaging.XmlMessageFormatter(new string[]{"Message.Bussiness.VideoPath,Message"});
VideoPath Vpath = (VideoPath)message.Body;
Response.Write(Vpath.SourceFilePath);
}
else
{
Response.Write("没有找到消息!");
}
需要注意的是,如果消息是一个自定义类型对象时,必须指定Message的序列化器,即Formatter属性。不合适的Formatter是无法正确反序列化消息的。
.NET中的消息队列的更多相关文章
- 工业物联网或系统集成中应用消息队列(ActiveMQ,C#的demo)的场景全面分析
1.[连载]<C#通讯(串口和网络)框架的设计与实现> 2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 2.应用SuperIO(SIO)和开源跨平台物联网框 ...
- C#中使用消息队列RabbitMQ
在C#中使用消息队列RabbitMQ 2014-10-27 14:41 by qy1141, 745 阅读, 2 评论, 收藏, 编辑 1.什么是RabbitMQ.详见 http://www.rabb ...
- Handler机制中的消息队列
--> 学习自蘑菇街大佬 Handler机制可以看成是一个消息阻塞队列,当有消息时立即处理消息,没有消息时则阻塞.在Android系统中APP启动后很快进入死循环,不断读取MessageQueu ...
- GaussDB(DWS)中共享消息队列实现的三大功能
摘要:本文将详细介绍GaussDB(DWS)中共享消息队列的实现. 本文分享自华为云社区<GaussDB(DWS)CBB组件之共享消息队列介绍>,作者:疯狂朔朔. 1)共享消息队列是什么? ...
- 在C#中使用消息队列RabbitMQ
1.什么是RabbitMQ.详见 http://www.rabbitmq.com/. 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源的操作,放入队列,再由另外一个线程,去异步处理这 ...
- 如何应用.NET中的消息队列服务
建立一个队列是应用MSMQ的第一步.您可以通过Windows计算机管理控制台中的消息队列选项完成这一操作,或者自己编程建立一个队列.列表A中的C#代码建立了一个新的私有MSMQ消息队列(如果不存在队列 ...
- 在WCF中使用消息队列
在一些大型的解决方案中,假设我们的服务没有办法一直在线,或者因为这样那样的原因宕机了,有没有什么办法让客户端的影响最小化呢?答案是可以通过消息队列的方式,哪怕服务是没有在线的,客户端依然可以继续操作. ...
- 删除MSMQ中的消息队列时"访问被拒绝的错误"
删除MSMQ中消息队列时出现 google之,发现也没有找到解决方法,自己在琢磨一下,一般出现这种问题的都是权限问题,因此查看了一下属性,果然如此 此消息队列是使用Windows服务创建的 解决办法: ...
- [Go]TCP服务中增加消息队列与工作池
之前的处理中每一个连接都会创建一个主groutine , 每个连接中的主groutine中创建出读groutine 和写groutine 每个连接处理业务再单独开出一个groutine ,这样如果有1 ...
随机推荐
- POJ -- 1151
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16222 Accepted: 6172 Descrip ...
- pdb文件部分解释
pdb文件包含了编译后程序指向源代码的位置信息,用于调试的时候定位到源代码,主要是用来方便调试的. 在程序发布为release模式时,建议将 pdb文件删除, 同时,对外发布的时候,也把 pdb删除, ...
- Java中static和final的区别
static是静态修饰关键字,可以修饰变量和程序块以及类方法: 当定义一个static的变量的时候jvm会将将其分配在内存堆上,所有程序对它的引用都会指向这一个地址而不会重新分配内存: 当修饰一个程序 ...
- php 修改上传文件大小
有些朋友要通过自己的网站后台,包括论坛,来上传一些文件,php一般为2m,或8m(以下我们按默认为2m),接下来就是来讲怎么修改上传文件大小的. 1.首先修改执行上传文件限制 一般的文件上传,除非文件 ...
- ubuntu Server LAmp环境
1. LAMP 的安装 sudo apt-get install apache2 mysql-server mysql-client php5 php5-gd php5-mysql 由于LAMP大部分 ...
- JavaScript运行机制浅析
从一个简单的问题谈起: <script type="text/javascript"> alert(i); var i = 1; </script> 输出结 ...
- Mysql查找如何判断字段是否包含某个字符串
Mysql查找如何判断字段是否包含某个字符串 有这样一个需求,在Mysql数据库字符串字段(权限)中,用户有多个不同的邮箱,分别被‘,’分开,现在要取出某个邮箱的所有成员列表. 假设有个表: ...
- ios 利用Reveal来调试界面2--真机调试(步骤详解)
使用真机调试我们的App界面,如果你的真机是没有越狱的设备,那么使用Reveal来调试UI的步骤是最麻烦的.
- notepad++下载Subversion插件,显示intalltion of subversion failed
notepad++安卓subversion的插件不成功,是因为我们下载TortoiseSVN客户端的版本跟subversion的版本不兼容 一.背景: 在新浪云平台上开发微信公众账号,因为要使用SVN ...
- cocos2d-x学习日志(13) --A星寻路算法demo
你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢?如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! A星算法简介: A*搜寻算法俗称A星 ...