消息队列(MSMQ)学习
1.首先在需要进行消息队列的服务器上安装MSMQ,我的系统是win2003+iis6,所以这个安装选项在添加删除程序->windows组件->应用程序服务器内.默认是不安装的,需要手动选择.
2.建立消息队列的存放路径.这可以在windows的计算机管理内添加,也可以在程序中添加.我是在程序中添加.
3.在.net中要引用System.Messaging;
using System.Collections.Generic;
using System.Messaging;
namespace MSMQ
{
class Program
{
private const string path = @".\private$\ljz";
private static MessageQueue queue = MessageQueue.Exists(path) ? new MessageQueue(path) : MessageQueue.Create(path, true);
//private static List<string> list = new List<string>();
public enum Level
{
Low,
Normal,
High
}
static void Main(string[] args)
{
Send("第一次!", Level.Low);
Send("第二次!", Level.Normal);
Send("第三次!", Level.High);
Console.WriteLine(Receive());
Console.WriteLine(Receive());
Console.WriteLine(Receive());
Send("异步第一次!", Level.Normal);
Send("异步第二次!", Level.High);
Send("异步第三次!", Level.Low);
ReceiveByAsyn();
//foreach (string str in list)
//{
// Console.WriteLine(str);
//}
Console.ReadKey();
}
public static void Send(string content, Level level)
{
System.Messaging.Message message = new System.Messaging.Message();
message.Formatter = new System.Messaging.BinaryMessageFormatter();
message.Body = content;
switch (level)
{
case Level.Low:
message.Priority = MessagePriority.Low;
break;
case Level.High:
message.Priority = MessagePriority.High;
break;
default:
message.Priority = MessagePriority.Normal;
break;
}
//MessageQueueTransaction tran = new MessageQueueTransaction();
//try
//{
// tran.Begin();
// queue.Send(message);
// tran.Commit();
//}
//catch
//{
// tran.Abort();
//}
queue.Send(message, MessageQueueTransactionType.Automatic);
}
public static string Receive()
{
System.Messaging.Message message = queue.Receive();
message.Formatter = new System.Messaging.BinaryMessageFormatter();
return message.Body.ToString();
}
public static void ReceiveByAsyn()
{
queue.ReceiveCompleted += new ReceiveCompletedEventHandler(queue_ReceiveCompleted);
queue.BeginReceive();
}
private static void queue_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
MessageQueue queueTmp = sender as MessageQueue;
System.Messaging.Message mess = queueTmp.EndReceive(e.AsyncResult);
mess.Formatter = new System.Messaging.BinaryMessageFormatter();
Console.WriteLine(mess.Body.ToString());
//list.Add(mess.Body.ToString());
queueTmp.BeginReceive();
}
}
}
下面对以上代码作几点解释:
1.上面的代码没有加异常处理,其实像这类代码是一定要加异常处理的!
2.路径.消息队列有好几种,有的可以被别人访问,如公共队列,有的则只能自己访问,如:专用队列.具体的分类,请参看下面列出的参考文章.但不是每种都可以使用.象我这种工作组模式的电脑,只能使用专用队列,即只能自己访问自己.它们的路径写法是有区别的:
Private: [MachineName]\Private$\[QueueName]
3.使用消息队列有两个重要的类:System.Messaging.Message与 System.Messaging.MessageQueue.我之所以列出全名,是因为在.net中有同名类,不要弄混了.下面的 MessageQueue与Message特指上面两个类.
MessageQueue是消息队列对象,里面有两个重要的方法:Send与Receive.顾名思义,Send是向消息队列发送消息,Receive是从消息队列接收消息.
Message是消息对象.它有两个重要的属性Formatter是其内容序列化格式属性,Body是其存放内容的主体.在上面的例子中我放的是字符串,其实它还可以放对象,前提是对象必须可以被序列化.
根据以上说的内容,己经可以写出一个消息队列的Demo了,但是还不够实用,下面要说的是其一些实用的属性.
1.优先级.不可否认,在实际应用中消息是有优先级的,有的消息重要需要优先被处理有的消息则一般.如何体现呢?Message对象有Priority属性,它有8个等级,我在上面的例子中只用了其中三个.通过设置优先级,可以实现让重要的消息优先被处理.
2.事务.有时候,在传输数据的过程中,需要保证数据的一致性,在数据库中常常用到事务,其实这里也有事务,在上面的例子中56-66行代码是事务处理,但是写的比较累赘,其实可以采用67行的写法,让系统自己去维护.
3.异步处理.MessageQueue对象的Receive方法有个缺点,当队列中没有数据时线程会锁死,直到有新的数据进入.这其实是不好的. 一种更好的处理方式是新开辟一个线程去处理,这样就不会影响现有的线程了.在.net中写法为例子的80与81行,让消息对象加载一个委托,然后把处理代 码放在委托内.
代码的第11行,32-35行,90行是我有意注掉的,其实我想的是当异步处理消息时,所做的应该只是把数据取出来就可以了,不应该还在里面进行处 理.而是在别的地方再对数据进行处理.我声明了个局部变量list,按理说第90行数据取出来后应该能加入这个list,然而事实是取出的数据有时能加进 去,有时却不行.我想这应该是多线程的问题..net默认禁止线程间互相内部调用.list是主线程的变量,打开异步后在子线程对其赋值,是不被允许的. 但是我想不通的是为什么有时候却也能赋值成功.也许是我理解有误.如果哪位牛人看到了我的困惑,希望能对我指点一二.现在我对多线程还不甚了解.(汗一 个~~~)
其实,个人认为,消息队列的应用范围还是比较有限的,首先,他只能是window系统,在.net下调用,然后,它对网络带宽要求比较高.所以在局 域网内应用还是比较好的,在interent上的应用,其实有更好的解决方案:.net remoting与web services
Demo下载:
http://ljzforever.qupan.com/?folder=951925
参考的文章:
ASP.NET中进行消息处理(MSMQ)一
http://dev.yesky.com/178/8196178.shtml
ASP.NET中进行消息处理(MSMQ)二
http://dev.yesky.com/229/8196229.shtml
.net+msmq快速访问数据库
http://developer.ccidnet.com/art/322/20030214/37984_1.html
消息队列(Message Queue)简介及其使用
http://www.cnblogs.com/rickie/archive/2004/11/16/64345.html
msmq两个网域之间消息传输与接收测试总结
http://www.cnblogs.com/billqi/archive/2005/12/29/307371.html
MSMQ在ASP.NET中的应用问题?谢谢!
http://topic.csdn.net/t/20020829/11/979610.html
. Net环境下消息队列(MSMQ)对象的应用
http://www.cnblogs.com/rickie/archive/2004/11/17/64712.aspx
.net的MSMQ异步调用
http://www.wangchao.net.cn/bbsdetail_37204.html
使用MSMQ
http://myxq.cnblogs.com/archive/2005/03/15/119150.aspx
转载于:https://www.cnblogs.com/ljzforever/archive/2010/03/09/1681752.html
消息队列(MSMQ)学习相关推荐
- C#使用消息队列(MSMQ)
(1).认识消息队列 首先说一下,消息队列 (MSMQ Microsoft Message Queuing)是MS提供的服务,也就是Windows操作系统的功能,并不是.Net提供的. MSDN上的解 ...
- 安装“消息队列 (MSMQ)”
在 Windows Server 2008 or Windows Server 2008 R2 上安装消息队列 4 在服务器管理器中,单击"功能". 在"功能摘要&quo ...
- 阿里云消息队列MQ学习—阿里云大学视频课
在刷ACE题的过程中,感觉对于消息队列部分的理解不是很深刻,这里来学习一下. 例行还是先走一遍阿里云大学的一些视频课程扫扫盲,选择如下课程: 阿里消息队列MQ简介:阿里巴巴中间件技术部自主研发的专业消 ...
- RT-Thread 消息队列(学习笔记)
本文参考自[野火EmbedFire]<RT-Thread内核实现与应用开发实战--基于STM32>,仅作为个人学习笔记.更详细的内容和步骤请查看原文(可到野火资料下载中心下载) 文章目录 ...
- MSMQ消息队列演示程序
对消息队列的概念在此就不用描述了,网上查"消息队列"或MSMQ关键词,有相应文章介绍. 我在这里提供了一个示例程序,在于让初学者快速上手. 1. 下载我的示例程序,下载地址为:h ...
- C# 消息队列之MSMQ
首先说一下,消息队列 (MSMQ Microsoft Message Queuing)是MS提供的服务,也就是Windows操作系统的功能,并不是.Net提供的. 消息队列(MSMQ)技术使得运行于不 ...
- 响应其他应用程序的系统菜单消息 insertmenu_「DDD」跟我一起学WCF(1)——MSMQ消息队列...
一.引言 Windows Communication Foundation(WCF)是Microsoft为构建面向服务的应用程序而提供的统一编程模型,该服务模型提供了支持松散耦合和版本管理的序列化功能 ...
- FreeRTOS学习 消息队列
消息队列 FreeRTOS学习仓库地址:https://gitee.com/killerp/free-rtos_-study 消息队列是RTOS的基础数据结构,用于任务之间.任务与中断之间进行数据传递 ...
- C#:消息队列应用程序
文章"MSMQ:可伸缩.高可用性的负载平衡解决方案(英文)"介绍了一种解决方案,用于高可用性消息队列 (MSMQ) 的可伸缩负载平衡解决方案体系结构.此解决方案中涉及了一种将 Wi ...
- 初识消息队列/RabbitMQ详解
欢迎大家阅读<朝夕Net社区技术专刊> 我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为忠实读者,文末福利不要错过哦! 今天来给大家分享 ...
最新文章
- invalid ELF header
- CCF 2016年题目题解 - Python
- [CareerCup] 4.5 Validate Binary Search Tree 验证二叉搜索树
- 25.智能指针.rs
- stk在计算机仿真中的应用_浅析仿真技术在激光系统设计中的应用
- 【人脸对齐-Landmarks】人脸对齐算法常用评价标准
- MySQL+Amoeba实现数据库主从复制和读写分离
- linux连接建立的时间,用timedatectl在Linux中检查当前时区及更改时区(创建符号链接来更改时区)...
- 4种方法帮你解决IntelliJ IDEA控制台中文乱码问题
- 判断输入几位数的正则_判断是几位数,并逆向输出此数的程序算法和说明
- 股灾情形下搞了个满堂红,我也是醉了
- 正则表达式的几个简单验证
- JVM初识之自定义类加载器
- 自动基线校正 python_红外光谱的
- CDN、SCDN、DCDN是什
- win7连接共享打印机时安装驱动程序出现0x00000bcb错误
- 交通信息工程 实验三:交通信号机仿真实验
- android图片自动翻转,android图片翻转镜像
- c语言srand函数
- 对接熊迈SDK工作记录之集成准备
热门文章
- Hibernate 的HQL和sql有什么区别
- 浅谈多个社交账号的登录注册设计
- 学习ubuntu之wget命令
- validate使用
- Apache下设置整站变灰方法
- 我的 Visual C++ 6.0学习网站
- java android rsa加密解密_Android中的RSA加密解密
- Luogu1919 【模板】A*B Problem升级版(FFT快速傅里叶)
- python语言程序设计期末试卷_Python语言程序设计17182试题题目及答案,课程2020最新期末考试题库,章节测验答案...
- 硬盘服务器作用,文件服务器有什么作用?