`
yhk051hf
  • 浏览: 15400 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

在ASP.NET中利用MSMQ(Leveraging MSMQ in ASP.NET Applications)

 
阅读更多

在ASP.NET中利用MSMQ(Leveraging MSMQ in ASP.NET Applications)
2011年01月23日
  介绍Introduction 你写过需要大量处理的web程序吗?或者曾经在浏览器上运行却总是time out? 大部分web开发人员都会碰见这些问题。随着web应用程序的要求的进化,处理和业务逻辑往往变得更加复杂。结果,不令人意外地这些web应用程序总是导致令人沮丧地web体验。
  另一方面,不管有多简单或者复杂的应用程序,总是会有花很长一段时间的进程。有时,处理的时候总是会导致在web应用程序中有结果。
  以上情况需要一个有效的方法来初始化长时间运行的进程,这样,可以根据web的同步的特点把问题给继承下来。这样长时间运行的进程就被一起最小化或者避免掉。 Requirements .NET Framework 1.1 (Visual Studio .NET helpful but not required)
  Basic familiarity with ASP.NET, .NET Framework
  Windows 2000 Professional/Server or Windows XP or 2003 Server  同步vs异步的编程概念Synchronous vs. Asynchronous Programming Concepts
  在一头扎进这些代码之前,理解一些编程模式的关键概念是非常重要的。首先开始同步模式。以最简单的形式,这种模式意味着调用者caller一直等到所有的处理都完成,并且控制权返回。 
  
  另一方,异步编程意味着调用者做了一个调用然后很快进行下一步。在调用者进程空间上的"callback"可以由接收方根据需要(如果可以的话)引发。(A "callback" located in the callers process space may be invoked by the recipient if desired (and available).) 
  
  异步的概念不仅适用于编程模式,也适用于结构。与编程模式相类似地模式,一个web应用程序可以设计成异步结构。因此,就可以处理web同步的时候所受到的限制。本文将讨论利用MSMQ来实施这样一个模式。
  MSMQ概览 Overview of MSMQ
  MSMA是"Microsoft Message Queue"的缩写。一个队列只是一个消息存储,可以由在.net中的API来获取,由System.Messaging类库来与MSMQ对接。
  MSMQ的主要用途是进行可靠,大规模,和高性能的分布式应用程序。MS最初发布MSMQ在NT4.0上,通过COM部件实施。
  最初的版本在编程来处理的时候非常复杂。 不过,它引入了非常多重要的概念和好处, 而且这些在今天的MSMQ中也得到了改善。 从MSMQ1.0以来,就有巨大的性能优势。
  For more information, previous version and current features, and support information on MSMQ, etc. please visit the Microsoft MSMQ Center. Also visit the article titled "Accessing Message Queues" for information on reading messages. 
  开始吧 Getting Started
  这本文章接下来就会给出一个一般的情形,用MSMQ来给出方案,然后过一过实施这些方案所要的必要步骤。
  一般情形 A Common Scenario
  假以时日,随着业务需求地演化,程序也要与时俱进。 想一想有一种情况,复杂的计算到了这样的地步,就是一个WEB应用程序不再web-time中处理了。
  实际上,随着要求的演化,用于这些计算的数据也有可能来自其它的系统,这就使情况变得更加复杂。
  在其它情况下,你在开发的应用程序可能对这个WEB最合适,可能只有一个或者几个后端件的例外(back-end pieces). 比如,生成一个报表,移动数据源的巨大的数据量等等。这些是web应用程序经常在某些时候要进行的动作。但是由于处理时间过于长,web不够时间处理(the Web doesn't lend itself well.)
  不幸地的是,这些情况下,你能去改善性能与反应时间的空间很少。经常地,开发人员求助于创建一厚客户端(thick-client)Windows应用程序, 它们可以居住在桌面上,这样就可以有更多的控制权来处理 timeout. 然而,这样也会让事情更加复杂。比如,把处理任务从服务器移动到客户端这样,巨大的问题就可能产生包括规模,案例和部署等等。
  一个很好的方案就是应用MSMQ实施一个异步地编程模式。
  建议方案:用MSMQ进行非连接处理(The Proposed Solution: "Disconnected Processing" with MSMQ) 
  从最高层次来讲,有三个主要的逻辑部件。这些部件可能存在于同一台机器上,也有可能根本就不在同一台机器上。
  
  ASP.NET客户端发一个消息到消息队列,然后欣欣然继续(moves on its merry way)。MSMQ部件是一个简单的消息中介(broker);它可以对消息读取与书写。当读取一个消息时,这个消息就从队列中被移除。.NET服务就监视MSMQ然后当消息接收到的时候就立刻处理。消息会一直堆积直到.NET服务准备好处理下一条消息。
  前提条件: 设置好MSMQ. Pre Requisite: Setting up MSMQ
  确保你有 Windows 2000/XP CD. 打开控制面板,"add/remove" Windows components, and ensure the Message Queuing Services checkbox is checked. 注意消息队列功能在发送方(客户端)和接收方(服务器端)都要安装好。
  
  这一步完成后,你就可以创建一个私人消息队列了。一个私人消息队列是用于工作组安装(workgroup installations),即 这台计算机没有进入Active Directory. 在私人队列当中也有一些限制之处。它们不会被发布,而公开队列却会。要想知道在私人队列里不能使用的framework方法的所有列表,请查看: 
  Platform SDK: Message Queuing Offline Reference
  打开MMC,add/remove the "Computer Management" snap-in, 浏览到"Services and Applications",展开后选择"Message Queueing"节点,右击"Private Queues",然后创建一个新的队列.
  
  过代码: 从Web写一条消息 Code Walkthrough: Writing a message from the Web
  The code for these steps have been included as well-simply unzip to a virtual directory and modify the web.config with your settings. 
  鉴于你已经创建了一条用于发送和接收消息的私人消息队列, 你可以很容易就用它来在Web应用程序中写消息。想要开始还要几步。这些代码已经在文件中有写,另外再修改一下web.config.
  Important Steps for setting using Messaging in an ASP.NET page 
  
  在完成了以上这些步骤后,你的代码就准备好要与MSMQ交互了。为演示方便,你可以简单地创建一页ASP.NET应用程序,简单一点的用户界面,再发一个消息到消息队列。
  
  这个接口表示了两个重要的元素,它们对于发送消息到一个MSMQ消息队列路径和消息本身是非常必要的,
  消息队列路径Message Queue Path
  一个消息队列路径字符串必须正确构建好。路径的词法变化很大,取决于你所正在说的消息的类型以及它在哪儿。在以上例子中,MSMQ存在于和Web服务器同一台机器上。然后,在现在环境中,MSMQ将在另一台机器上。队列路径的例子如下: Message 当在.NET中使用MSMQ时,一条消息可以是任何可以序列化的对象。当序列化一条消息给MSMQ时,你可以使用不同的formattter(包括Binary,XML,或者甚至是ActiveX, 它可以允许发送COM对象-当你想接进现在存在的MSMQ的基于COM的aware应用程序的时候会有用useful if you want to tap into an existing MSMQ aware application based on COM). ). 你可以通过你所发送的消息对象来定义你的消息的格式。要想知道更多的关于消息选择的信息,请看MSDN文件:Accessing Message Queues. 
  在这篇文章的例子中,默认的格式器(XML序列化)用于发送一条消息到队列,而这条消息只是一个字符串对象。就象之前所提的那样,这条消息可以是任何可以序列化的,比如一个可以直接被listener进程所应用的业务对象(business object). 
  代码片: 发送一条消息 Code Snippet: Sending a Message
  MessageQueue MyMessageQ; Message MyMessage; MyMessageQ = new MessageQueue(txtQueuePath.Value); MyMessage = new Message(txtMessageToSend.Value); MyMessageQ.Send(MyMessage); divMessage.InnerHtml= "Message sent successfully!"; 
  在这个例子中,要使用MSMQ的一个非常重要的理由就是为了要为用户分离出冗长的处理过程。结果,在发送消息之后,Web页已经完成了处理然后控制权也立刻交回到了用户手中.
  过代码:接收和处理一条消息 Code Walkthrough: Receiving & Processing a Message
  要在给定的情形中使用MSMQ接收一条消息, 就必须有一个独立的进程在运行以观察队列. 一个实施这种进程的好方法就是创建一个简单的.NET服务用于收听队列然后当消息刚一发送给她就立刻处理。
  代码片:在.NET服务中接收一条消息 Code Snippet: Receiving a message in the .NET service:  "DoSomeLongRunningProcess" 方法包含了实施进程的代码,如果一个web页要运行它的话,它将造成一个timeout。
  (The "DoSomeLongRunningProcess" method contains code that performs a process that would otherwise cause a timeout if a Web page were running it. )
  在这个方法的整个处理过程中,一个数据库表格的状态信息会被更新(之后会看到),这样在任何一个时间点内,处理的状态都可以被终止。
  为了安装包括在源代码里面的服务,你可以在把它们发送(shell out)到命令行之后只运行以下指令:
  C:\WINNT\Microsoft.NET\Framework\v1.1.4322\install util msmqService_listener.exe
  成功安装完之后,你将看到信息文本,另外一个确认信息:  "The Commit phase completed successfully.  The transacted install has completed." 在安装了收听服务后,你可以打开管理控制面板,然后浏览到目前的在你的机器上运行的Windows 服务. 你应该可以看到如下图所示的服务:
  
  在unzipping了这个服务后,你得确保在MSMQService_Listener.exe.config里面的路径是正确的。(在这个文件中有帮助-它在bin目录下)
  你现在可以通过右击"Start"来起动你的服务,然后be on your merry way.
  Other Considerations 其它考虑
  消息队列Receive方法会无限期等待直到在队列上收到一条消息.
  根据你正在处理的类型,你可能想把一些队列消息(worker threads)先排队,这样就可以立刻接收和处理多条信息。结果,这种处理的类型就可以非常高效率和大规模(scalable)。
  在消息队列对象上当然还有值得研究的许多其它方法. 下面就是一些值得注意的:  Method Name Description 
  Peek 进行非破坏性的消息阅读, 即Peeking之后,消息没有被删除.(Read会清除消息) 
  BeginRead / EndRead, BeginPeak/ End Peak 允许消息的异步处理.当一条消息正在被接收的时候,代码也将继续运行. 当消息被完全接收后,event handler就会运行. 
  Delete 把一条消息清除出队列. 
  过代码: 检查状态消息. Code Walkthrough: Checking Status Information
  正如上面所显示的那样,在Web页已经触发了一个长时间运行的进程之后,用户可以需要一个状态信息。
  提供状态信息的一个简单技术可以是把这条信息(从进行处理的.NET服务,上面有述)写入到数据表格.
  Web应用程序可以根据用户的请求来检查这个数据表以确认目前的状态. 
  Database Table
  以上表格可以跟踪一个队列名和目前的状态。
  在实际情况中,你最有可能是想跟踪更多信息(比如发生的错误,有关接收消息的信息等).
  当listener服务收到一条消息之后,这个状态表格会在处理的时候相应更新。 
  代码Snippet: 查看表格 Code Snippet: Viewing the Table 根据提供的源代码,一个基于Web的接口会读取这个表格,然后显示目前的状态。 
  要得到最新的状态,用户必须点击"Show Status"按钮。
  下面就是状态如何进行的例图:
  
  结论 Conclusion
  本文演示了如何通过MSMQ和System.Messaging Framework来处理长时间运行的Web进程的一项简单技术。MSMQ是一个非常有用的产品,开发人员应该考虑一下如果在Web应用程序中使用。
  About the Author
  Greg Huber is the President and Founder of the Northwest Ohio .NET Users group (http://www.nwnug.com). He is active in the .NET community-speaking at area user groups, serving on the INETA (http://www.ineta.org) user group relations committee, and spearheading community-oriented development initiatives, including Quizzard, a shared-source .NET quiz game. He has been developing and architecting software on the Microsoft platform since 1998, and is currently a lead developer at NFO Worldgroup. 
分享到:
评论

相关推荐

    MSMQ在ASP.NET中应用2

    MSMQ在ASP.NET中应用MSMQ在ASP.NET中应用MSMQ在ASP.NET中应用

    MSMQ在ASP.NET中应用;demo

    MSMQ在ASP.NET中应用MSMQ在ASP.NET中应用MSMQ在ASP.NET中应用

    MSMQ在ASP.NET中应用

    MSMQ(MicroSoft Message Queue)在ASP.NET中的应用

    ASP.NET中进行消息处理(MSMQ)

    MSMQ是微软消息队列的英文缩写。那么什么是消息队列?这些介绍网上一大片这里就不多说了。本文对于大虾级的人物来说这只是小玩意而已,对于初学者来说这文章还是有一定的帮助,希望路过的大虾们别笑话我班门弄斧。

    .NET调用MSMQ方法

    WIN7中安装MSMQ,.NET调用MSMQ

    ASP.NET完全入门

    《ASP.NET完全入门》面向初...第七篇“高级应用”——在高级应用一篇中,我们将介绍三个方面的内容:XML在ASP.NET中的应用、三层结构及其应用、以及微软消息队列(MSMQ),这些是作为一个高级应用者所必需掌握的知识。

    asp.net完全入门

     第七篇 “高级应用”——在高级应用一篇中,我们将介绍三个方面的内容:XML在ASP.NET中的应用、三层结构及其应用、以及微软消息队列(MSMQ),这些是作为一个高级应用者所必需掌握的只是。 学习本书需要使用的...

    在ASP.NET中进行消息处理(二)

    在ASP.NET中进行消息处理(二) 讲 师:邵志东 MSDN特邀讲师 课程简介:MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同...

    《ASP.NET 完全入门》

     第七篇 “高级应用”——在高级应用一篇中,我们将介绍三个方面的内容:XML在ASP.NET中的应用、三层结构及其应用、以及微软消息队列(MSMQ),这些是作为一个高级应用者所必需掌握的只是。 学习本书需要使用的...

    ASP.NET完全入门PDF

    第一篇 概论 第一章 微软.NET战略和ASP.NET简介i. 微软.NET的历史 ii. ASP.NET历史iii. 众说纷纭.NET iv. ASP.NET综述 v. 小结第二章 我的第一个ASP.NET程序 i. 配置开发环境ii....第六章在ASP中使用.NET

    ASP.NET中进行消息处理(MSMQ)三

    在本文的前两篇文章里对MSMQ的相关知识点进行了介绍,很多阅读过这前两篇文章的朋友都曾问到过这样一些问题:1、如何把MSMQ应用到实际的项目中去呢?2、可不可以介绍一个实际的应用实例?3、......在前两篇文章里,...

    在ASP.NET中进行消息处理(一)

    讲 师:邵志东 MSDN特邀讲师 课程简介:MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式...在本次讲座中我们将介绍有关MSMQ在ASP.NET中的应用的知识。

    MSMQ和.Net+Remoting在MES开发中的应用

    MSMQ和.Net+Remoting在MES开发中的应用

    asp.net知识库

    asp.net 2.0中利用app_offline.htm功能 .NET 2.0中的字符串比较 小试ASP.NET 2.0的兼容性 为 asp.net 2.0 的菜单控件增加 target 属性 ASP.NET 2.0 的内部变化 常见的 ASP.NET 2.0 转换问题和解决方案 Asp.Net2.0无...

    Inside ASP.NET

    6. Using ADO.NET in ASP.NET Applications Data Access from a Web-Based Perspective ADO and ADO.NET Working with the Main ADO.NET Objects Building Data-Oriented Web Forms Transaction-Enabled ...

    asp.net 完全入门

    第一篇 概论 第一章 微软.NET战略和ASP.NET简介 i. 微软.NET的历史 ii. ASP.NET历史 iii. 众说纷纭.NET ...iv. ASP.NET综述 ...v....我的第一个ASP.NET程序 ...i....ii....iii....iv. 近观ASP.NET ...第六章 在ASP中使用.NET

    Asp.net中文手册(CHM)

    第一篇 概论</p> 第一章 微软.NET战略和ASP.NET简介 第二章 .NET的安装与运行环境</p> 第二篇 Web Form</p> 第一章 Web Form简介(上) 第一章 Web Form简介(下) 第二章 服务器端控件(上) ...

Global site tag (gtag.js) - Google Analytics