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

翻译 2011年01月23日 18:52:00

参考: http://www.15seconds.com/issue/031202.htm

 

介绍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

 

 

Visual Studio.NET Method Framework Method
Add a reference in your Solution to System.Messaging:
Explicitly add the assembly to your web.config under the :

 

** 注意,你可以用"gacutil"工具来证实这些Assembly信息

Add the line to the top of the class:

using System.Messaging;

Add the line to the top of the page:

<%@ Import Namespace="System.Messaging" %>

 

 

在完成了以上这些步骤后,你的代码就准备好要与MSMQ交互了。为演示方便,你可以简单地创建一页ASP.NET应用程序,简单一点的用户界面,再发一个消息到消息队列。

 

 

这个接口表示了两个重要的元素,它们对于发送消息到一个MSMQ消息队列路径和消息本身是非常必要的,

 

消息队列路径 Message Queue Path

 

一个消息队列路径字符串必须正确构建好。路径的词法变化很大,取决于你所正在说的消息的类型以及它在哪儿。在以上例子中,MSMQ存在于和Web服务器同一台机器上。然后,在现在环境中,MSMQ将在另一台机器上。队列路径的例子如下:

 

Queue Type Location message is sent from Example
Public Queue (must belong to ActiveDirectory) Anywhere ServerName/QueueName
Private Queue Same server MSMQ resides on ./private$/QueueName
Private Queue Any remote location FormatName:DIRECT=OS:machinename/private$/queuename

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= "<b>Message sent 
successfully!</b>";

 

在这个例子中,要使用MSMQ的一个非常重要的理由就是为了要为用户分离出冗长的处理过程。结果,在发送消息之后,Web页已经完成了处理然后控制权也立刻交回到了用户手中.

 

过代码:接收和处理一条消息 Code Walkthrough: Receiving & Processing a Message

 

要在给定的情形中使用MSMQ接收一条消息, 就必须有一个独立的进程在运行以观察队列. 一个实施这种进程的好方法就是创建一个简单的.NET服务用于收听队列然后当消息刚一发送给她就立刻处理。

 

代码片: 在.NET服务中接收一条消息 Code Snippet: Receiving a message in the .NET service:


	MessageQueue MyMessageQ;
		Message MyMessage;

		MyMessageQ = new MessageQueue(_QueuePath);
		MyMessage = MyMessageQ.Receive;	
		WriteStatus("Message Received!");
		DoSomeLongRunningProcess();
		WriteStatus("Processing Finished!");

"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/installutil 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


string dbConnString = 
ConfigurationSettings.AppSettings["AccessDBConnectionString"]; 

//Create connection object 
OleDbConnection oCon = new OleDbConnection(dbConnString); 
string sSQL = "Select * FROM QueueStatus ORDER By ID Desc"; 
OleDbCommand oCmd= new OleDbCommand(sSQL, oCon); 
oCon.Open(); 

dgStatus.DataSource = oCmd.ExecuteReader(); 
dgStatus.DataBind();

根据提供的源代码,一个基于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.

相关文章推荐

ASP.NET中消息队列(MSMQ)初探

参考: http://www.cnblogs.com/zzxbest/archive/2010/01/27/1657458.htmlhttp://dev.yesky.com/178/8196178.s...

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

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

MSMQ在ASP.NET中应用2

  • 2009-01-09 15:15
  • 124KB
  • 下载

Implementing Policy Injection in ASP.NET Applications

http://www.codeguru.com/csharp/.net/article.php/c17807 Introduction Policy Injection Block w...

Running ASP.NET 5 applications in Linux Containers with Docker

As a part of our ASP.NET 5 cross-platform efforts, we are actively working on making applications wr...

.net 中MSMQ的使用--小例子

一、在学习Messagequeue 类之前,首先介绍一下MSMQ的一些理论上的知识          MSMQ(MicroSoft Message Queue,微软消息队列)官方的解释是:在多个不同的...

【6】.net msmq消息队列实例

1.msmq消息队列windows环境安装 控制面板----》程序和功能----》启用或关闭Windows程序----》Microsoft Message Queue(MSMQ)服务器 选...

HOW TO Set Up Multi-Server ASP.NET Web Applications and Web Services

This step-by-step article discusses how to set up multi-server ASP.NET Web Applications and Web serv...

(待翻译)Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication

IIS and ASP.NET Processing Note   The information in this section applies to Internet Information...

ASP.NET MVC Sample Applications - Open-Source Examples and Tutorials

http://www.tampadev.org/News/Details/ASPNETMVCSampleApplicationsOpenSourceExamplesTutorials   ASP....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)