- 浏览: 114535 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
jianxia801:
哥们你这个比较适用,但是无法下载!还有一个问题,你这个斜线回跟 ...
用js作表格的表头斜线 -
jianxia801:
哥们你的这个表格不错 不知道是否源码给我发送一份多谢先。你的无 ...
用js作表格的表头斜线 -
mistbow:
请问您知道有能编辑数学公式的文本编辑器吗?
几款在线文本编辑器的比较 -
sulangdong:
下载地址不可用,我QQ:592207250,邮箱:suxut ...
用JS+vml作三维报表 -
wushanlang:
很好!!先试试
JS的TreeGrid控件,累死我了!
直到今天才知道,在我们每天都在用的Window系统里还有这么好用的一个编程组件:消息队列.它能够解决在大数据量交换的情况下的性能问题,特别是BS系统的数据库性能.而且它的异步处理方式能给程序员最大的便利与最好的用户体验.
1.首先在需要进行消息队列的服务器上安装MSMQ,我的系统是win2003+iis6,所以这个安装选项在添加删除程序->windows组件->应用程序服务器内.默认是不安装的,需要手动选择.
2.建立消息队列的存放路径.这可以在windows的计算机管理内添加,也可以在程序中添加.我是在程序中添加.
3.在.net中要引用System.Messaging;
using System; 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.路径.消息队列有好几种,有的可以被别人访问,如公共队列,有的则只能自己访问,如:专用队列.具体的分类,请参看下面列出的参考文章.但不是每种都可以使用.象我这种工作组模式的电脑,只能使用专用队列,即只能自己访问自己.它们的路径写法是有区别的:
Public: [MachineName]\[QueueName] 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
发表评论
-
关于用户控件中文件链接的处理
2009-08-06 15:19 1171最近在开发网站, ... -
petshop4.0学习笔记之设计模式
2009-06-05 00:09 1198在petshop4.0中也用到了几个常用的设计模式:简单工厂模 ... -
petshop4.0学习笔记之多线程
2009-06-03 16:12 1026一直搞web开发,每天接触最多的就是asp.net+css+j ... -
vs2005中母版页嵌套时无法切换到设计视图的解决办法
2009-05-20 13:50 1757假设有母版页第一级母 ... -
asp.net 编译模型学习笔记
2009-05-15 17:31 1615当一个web应用程序完成 ... -
asp.net 母版页学习笔记
2009-05-15 00:12 1091看来父亲对儿子永远是最了解的。看了Asp.net之父Scott ... -
asp.net ViewState学习笔记
2009-05-13 14:41 1039这些还是前辈们都研究 ... -
asp.net底层架构学习笔记(HttpRuntime,HttpApplication...)
2009-05-12 23:19 1488这些个东东我都是学习前辈,该说的前辈都已说过了,该做的前辈也已 ... -
asp.net中控件id,clientid,uniqueid的区别
2009-04-27 14:13 1458id是你在代码编写时给其赋的id属性,如果没有进行赋值 ... -
浅析asp.net的自定义控件
2009-04-26 15:46 845自定义控件分两种:简 ... -
httphandlers 与 httpmodules
2009-04-25 16:48 2049HttpHandlers 和 HttpMod ... -
asp.net 缓存研究
2009-04-24 09:37 1180最近因项目要求,需要研究asp.net缓存,可是查阅了书本,m ... -
如何以编程方式加载用户控件
2009-04-23 14:35 969有用户控件文件:usercon.ascx,类名为:myCont ... -
web.config常用配置研究
2009-04-18 17:54 1256web.config 是asp.net的Web应用程序不可缺少 ... -
eval,bind,container.dateitem,数据绑定的研究
2009-04-17 14:49 1574首先,eval与bind是两个方法,都可以实现前台数据绑定Bi ... -
asp.net2.0 知识体系
2009-04-15 09:37 770入行计算机软件行业13个月了,搞.net开发也快1年了,跟据在 ... -
asp.net 的状态管理与cache
2009-04-14 15:10 1110在我的印象中,谈到状 ... -
asp.net的下载实现
2009-04-09 14:40 995我现在接触到的下载有两种形式: 直接下载服务器某个目录下的文件 ...
相关推荐
petshop4.0源代码 查看 petshop4.0源代码 查看 petshop4.0源代码 查看 petshop4.0源代码 查看 petshop4.0源代码 查看 petshop4.0源代码 查看
最近一直在看PetShop4.0,因为之前一直使用net1.1开发,本想转到2.0开发,怎奈公司的服务器是2000,想升级的话一大堆麻烦着等我。而且也不一定升级后就好,老的服务器,还有其他的因素使得我放弃了转到2.0了。
PetShop4.0架构设计PetShop4.0架构设计PetShop4.0架构设计
然而PetShop随着 版本的不断更新,至现在基于.Net 2.0的PetShop4.0为止,整个设计逐渐变得成熟而优雅,却又很多可以借鉴之处。PetShop是一个小型的项目,系统架构与代码都比较简单,却 也凸现了许多颇有价值的设计与...
petshop4.0以及petshop4.0详解。。。。。。。。。。
Petshop4.0详解 pdf。
PetShop 4.0 (宠物商店C#版),包含Microsoft .NET Pet Shop 4.0.msi 以及PetShop 4.0详解.pdf 详细说明
此资源包括PetShop4.0项目(Source Code+Databases)的安装以及PetShop4.0项目的详细说明文档。 注意1:请确保你已经安装了VS2005和(SQL Server2000或SQL Server2005或Oracle 10g)。 注意2:请按照安装提示一步步...
然而PetShop随着版本的不断更新,至现在基于.Net 2.0的PetShop4.0为止,整个设计逐渐变得成熟而优雅,却又很多可以借鉴之处。PetShop是一个小型的项目,系统架构与代码都比较简单,却也凸现了许多颇有价值的设计与...
petshop4.0详细教程,肯叮对你们有用的!!!
petshop4.0代码|数据库|PDF教程,标准的分层架构,运用了许多新技术。 值得一学
petshop 4.0源码及详细讲解,需要安装vs2005运行环境
PetShop 4.0 官方详解
PetShop 4.0的安装文件 学习ASP.NET架构的一个绝佳例子
PetShop4.0详解(系统架构设计).doc
petshop4.0详解 petshop4.0详解petshop4.0详解 petshop4.0详解petshop4.0详解petshop4.0详解
然而PetShop随着版本的不断更新,至现在基 于.Net 2.0的PetShop4.0为止,整个设计逐渐变得成熟而优雅,却又很多可以借鉴之处。PetShop是一个小型的项目,系统架构与代码都比较简单,却 也凸现了许多颇有价值的设计与...
petshop4.0 详解完整版(一至八) .NET 2.0 真正的经典!
petshop 4.0 5.0 微软原版设计模式值得学习,设计模式完全解释。
PetShop 4.0 源码 学习 经典 C# aspnet 架构 ADO.NET 事务