`
ljzforever
  • 浏览: 117501 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

petshop4.0学习笔记之消息队列(MSMQ)

阅读更多

      直到今天才知道,在我们每天都在用的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

分享到:
评论

相关推荐

    PetShop4.0学习笔记(1)

    ### PetShop4.0 学习笔记(1) #### 背景介绍 根据描述,作者之前一直在使用.NET 1.1进行开发工作,并计划转向.NET 2.0。但是由于公司使用的服务器版本为Windows 2000,升级.NET框架会遇到一系列问题,包括可能与...

    PetShop 4.0 (宠物商店C#版)

    《PetShop 4.0:深入理解C#与ASP.NET应用开发》 PetShop 4.0是一款基于C#编程语言和ASP.NET框架的应用程序,它以宠物商店为业务场景,为开发者提供了一个完整的Web应用程序示例。这个项目旨在帮助学习者理解和掌握...

    petshop4.0以及详解

    PetShop 4.0是学习.NET开发的绝佳案例,它提供了详细的源代码,可以帮助开发者理解.NET的实战应用。通过分析和重构PetShop 4.0,开发者可以提升自己的.NET编程技能,掌握企业级应用的开发方法。 总结,PetShop 4.0...

    petshop4.0详细教程

    《PetShop 4.0 全面解析》 PetShop 4.0 是一个经典的.NET技术示例应用,它展示了如何构建一个完整的电子商务网站。这个详细的教程将带你深入理解PetShop 4.0的设计理念、架构和技术栈,帮助你提升在.NET领域的专业...

    PetShop4.0(ppt)

    PetShop 4.0是这个系列的最新版本,它全面采用了微软的.NET Framework 2.0和Asp.Net技术,为我们提供了深入学习.NET设计模式和架构的宝贵资源。 .NET Framework 2.0是微软推出的一种全面的开发框架,它包含了用于...

    petshop4.0源代码 查看

    petshop4.0源代码 查看 petshop4.0源代码 查看 petshop4.0源代码 查看 petshop4.0源代码 查看 petshop4.0源代码 查看 petshop4.0源代码 查看

    petshop4.0代码|数据库|PDF教程

    《PetShop4.0:深度探索与学习指南》 PetShop4.0是一个经典的应用程序示例,由Microsoft开发,用于展示.NET Framework的功能和最佳实践。这个项目以其标准的分层架构闻名,不仅包含了前端界面,还包括了业务逻辑层...

    petshop 4.0源码及详解

    通过深入研究PetShop 4.0的源码,开发者不仅可以学习到.NET Framework的基础知识,还能掌握到高级特性的实际应用,例如面向服务的架构(SOA)、设计模式、缓存策略等,这些都是构建高效、可扩展的Web应用程序的关键...

    Petshop4.0详解.pdf

    ### Petshop4.0详解之系统架构设计 #### 前言 PetShop是一个由微软推出的示例项目,旨在展示.NET框架在企业级应用开发中的能力。随着时间的推移,PetShop经历了多个版本的迭代,从最初的.NET 1.x发展到了基于.NET ...

    PetShop 4.0 官方详解

    .NET PetShop 4.0 还包含了新的功能,如自定义的ASP.NET 2.0 配置文件提供程序和通过MSMQ(Microsoft Message Queuing)进行的异步订单处理,这些都是提高系统性能和可靠性的重要组成部分。 #### 从 ASP.NET 1.1 ...

    PetShop4.0架构设计

    PetShop 4.0 架构设计是一个经典的案例,展示了如何构建基于.NET Framework 2.0和Asp.Net的Web应用程序。这个系统以其简洁的三层架构而...通过学习PetShop 4.0,开发者能够提升自己在设计和实现企业级应用方面的能力。

    petshop4.0

    在PetShop 4.0中,我们可以学习到以下几个重要的知识点: 1. **ASP.NET**:PetShop 4.0主要基于ASP.NET框架构建,这是一个用于构建动态网站、Web应用和Web服务的平台。它提供了诸如页面生命周期管理、控件模型、...

    PetShop4.0框架详解

    1. 开发流程:学习PetShop4.0可以帮助开发者了解一个完整的Web应用从需求分析、设计、编码到测试的全过程,理解每个环节的关键点。 2. 技术实践:通过研究PetShop4.0的源代码,可以加深对ASP.NET框架的理解,掌握...

    PetShop4.0 源码安装程序

    然而PetShop随着 版本的不断更新,至现在基于.Net 2.0的PetShop4.0为止,整个设计逐渐变得成熟而优雅,却又很多可以借鉴之处。PetShop是一个小型的项目,系统架构与代码都比较简单,却 也凸现了许多颇有价值的设计与...

    PetShop4.0源码

    《PetShop 4.0 源码深度解析与学习指南》 PetShop 4.0 是一个经典的ASP.NET应用程序示例,它以其简洁而全面的C#代码库,为初学者和经验丰富的开发者提供了深入理解Web应用架构的宝贵资源。这个项目不仅展示了ASP...

    PetShop4.0项目(Source Code+Databases)的安装及PetShop4.0项目的详细说明

    此资源包括PetShop4.0项目(Source Code+Databases)的安装以及PetShop4.0项目的详细说明文档。 注意1:请确保你已经安装了VS2005和(SQL Server2000或SQL Server2005或Oracle 10g)。 注意2:请按照安装提示一步步...

    PetShop4.0的系统架构设计分析

    尽管PetShop4.0在某些方面(如未使用ORM)存在不足,但总体上它仍然为我们提供了一个很好的学习示例。通过细致地研究其设计原理和实现细节,我们可以从中汲取宝贵的经验和灵感,帮助我们在未来的项目中构建出更加...

    PetShop 4.0的安装文件

    PetShop 4.0的核心亮点之一是其使用了ASP.NET架构,包括以下几个关键部分: 1. **ASP.NET页面生命周期**:PetShop展示了如何处理页面从请求到响应的完整生命周期,包括初始化、加载、验证、呈现和卸载等阶段。 2. ...

    PetShop4.0

    【标题】"PetShop4.0" 是一个基于.NET框架的示例应用程序,展示了三层架构在实际项目中的应用。这个项目作为一个学习资源,为开发者提供了一个理解如何在企业级应用中分离业务逻辑、数据访问和用户界面的实例。 ...

Global site tag (gtag.js) - Google Analytics