了解MSMQ,控制ASP进程 (一)(转贴)

进程|控制

我们在使用 ASP 程序时常常会遇到这些情况:某个进程花费了过长的时间而导致在客户端过期、访问者已经放弃了对你的网站的访问而离开去了别的网站、或你的服务器上阻塞了大量的死队列时,系统出现 "Server is too busy" 错误信息。

   当你在设计网站的过程中碰到这些问题时,一个有效的解决办法就是使用 Microsoft Message Queue (MSMQ) 来结束这些进程,让网站恢复正常!

   到底 MSMQ 是个什么样的东西呢?我们下面作一下了解:

   一、 Microsoft Message Queue 的基本介绍:

   MSMQ ( 代号又叫 "Falcon") 是运行在 Windows NT 的服务 , 它提供运用程序之间的异步通讯。你可以在 NT4 Option Pack 中找到它。 MSMQ 的基本概念非常的简单:它可以被看成是运用程序之间的 email :一个消息被打包到一个特定类型的容器中,并把这个消息保存到一个用与特别作用的队列中直到收信者接受该消息为止。这些队列能够确保 MSMQ 的传送,而不管当前网络连接的状况如何。

   象所有的电子邮件一样, MSMQ 消息有一个发送者和一个接收者 , 其中的接收者应该能够访问队列。一个单一队列中的一个单独消息,它拥有多个接受者例如 respinder 。而消息的发送者通常是 Web Server(IIS) 。

   MSMQ 也能够和其他消息系统进行通讯。例如: Sun Solaris, HP-UNIX,OS/2, VMS, AS/400 平台。像其他的 BackOffice 服务一样, MSMQ 有一个 COM API ( mqoa.dll ) 提供给开发者开发程序。其中最常用的三个类为: MSMQQueueInfo, MSMQQueue, MSMQMessage 。

   ( 1 )、 MSQMQueueInfo

   MSMQQueueInfo 允许你新建,打开,删除队列中的消息 . 要和队列建立联系首先需要设置 PathName ,这是一个命名队列的属性,它告诉 MSQM 是哪台机器上的队列。
< %
Dim objQueueInfo
Dim objQueue
Set objQueueInfo=Server.CreateObject("MSMQ.MSMQQueueInfo")
objQueue.PathName = ".\MyQu"
Set objQueue = objQueueInfo.Open(MQ_SEND_ACCESS, MQ_DENY_NONE)
%>

   上面的代码打开一个叫 MyQueue 的本地队列。如果队列在另外一台服务器上,代码应该是这样的:

   objQueue.PathName = "SomeOtherComputer\MyQu"

   打开队列中有两个参数: Access 和 ShareMode 。 Access 表示将要对队列执行什么操作。一般有三个操作:

   MQ_PEEK_ACCESS (32), MQ_RECEIVE_ACCESS (1), MQ_SEND_ACCESS (2) 。

   MQ_PEEK_ACCESS 用来在特定的队列中查找消息。但对该消息不进行操作。

   MQ_RECEIVE_ACCESS 用来在读取队列中的消息后删除它。

   MQ_SEND_ACCESS 用来在队列中发送消息 , 但不接收消息。

   需要注意的是在使用打开操作后返回了一个 MSMQQueue 对象。下面是一个典型的新建和删除操作例子:
< %
Dim objQueue
Set objQueue = Server.CreateObject("MSMQ.MSMQQueueInfo")
objQueue.PathName = ".\MyQu"
objQueue.Create
%>

< %
Dim objQueue
Set objQueue = Server.CreateObject("MSMQ.MSMQQueueInfo")
objQueue.PathName = ".\MyQu"
objQueue.Delete
%>

   ( 2 )、 MSMQQueue

   MSMQQueue 类用来描述一个在 MSMQ 服务中打开的队列。该类提供了一个用来在指针队列中的消息进行循环的功能。你不能够打开一个使用了 MSMQQueue 类的队列要这么干只能够使用 MSQMQueueInfo (见上例),虽然许多 ASP 运用程序通常使用 MSMQ 来发消息,但是很多时候也需要 ASP 来显示这个消息的具体内容。

   获取消息的方式有两种:同步方式,异步方式,但是 ASP 只能够使用同步方式。这是因为 ASP 不能够在服务端申明一个 WithEvents 变量。

   下面先举一个异步方式使用 MSMQ 的例子(仅 VB 中)
Option Explicit
Dim m_objQueueInfo As New MSMQQueueInfo
Dim m_objQueue As MSMQQueue
Dim WithEvents m_objMSMQEvent As MSMQEvent

Private Sub Form_Load()
m_objQueueInfo.PathName = ".\MyQu"
m_objQueueInfo.Label = "My Sample Queue"
On Error Resume Next
m_objQueueInfo.Create
On Error GoTo 0
Set m_objQueue = m_objQueueInfo.Open(MQ_RECEIVE_ACCESS, MQ_DENY_NONE)

Set m_objMSMQEvent = New MSMQEvent
m_objQueue.EnableNotification m_objMSMQEvent, MQMSG_CURRENT, 1000
End Sub

Private Sub m_objMSMQEvent_Arrived(ByVal Queue As Object, ByVal Cursor As Long)
Dim m_objMessage As MSMQMessage
Set m_objMessage = Queue.PeekCurrent
MsgBox "Message Received: " & m_objMessage.Label
m_objQueue.EnableNotification m_objMSMQEvent, MQMSG_NEXT, 10000
End Sub

Private Sub m_objMSMQEvent_ArrivedError(ByVal Queue As Object, ByVal ErrorCode As Long, ByVal Cursor As Long)
MsgBox "Error accorded: " & ErrorCode
End Sub

   这段代码首先建立一个队列(如果它还不存在的话)。然后 m_objMSMQEvent 对象通过调用 EnableNotification 连接到 MSMQQueue 对象。一旦连接到 MSMQEvent 对象 , 接下来需做的仅仅是完成 Arrived 和 Arrived_Error ( 可选的 ) 事件。 Arrived 事件当一个新的消息到达队列时将被触发该事件返回两个指针 , 一个是指向队列中应该从来开始读消息的位置,另外一个是当前的位置。如果发生错误,将触发 ArrivedError 事件当同步获取消息时,会一直等到消息可获取或则超时时程序才会不被挂起。代码如下:
Public Sub DisplayMessages()
Dim objQueueInfo As New MSMQQueueInfo
Dim objQueue As MSMQQueue
Dim objMessage As MSMQMessage
objQueueInfo.PathName = ".\MyQu"
objQueueInfo.Label = "My Sample Queue"

On Error Resume Next
objQueueInfo.Create
On Error GoTo 0
Set objQueue = objQueueInfo.Open(MQ_RECEIVE_ACCESS, MQ_DENY_NONE)
Do While True
Set objMessage = objQueue.Peek(, , 1000)
If objMessage Is Nothing Then Exit Do
MsgBox "Message: " & objMessage.Label
Loop
MsgBox "No more new messages."
objQueue.Close
Set objMessage = Nothing
Set objQueue = Nothing
Set objQueueInfo = Nothing
End Sub

   ( 3 )、 MSMQMessage

   MSMQMessage 类支持队列中消息的所有属性。 MSMQ 消息有两个方法和繁多的属性。

时间: 2024-08-08 18:01:31

了解MSMQ,控制ASP进程 (一)(转贴)的相关文章

了解MSMQ,控制ASP进程

我们在使用 ASP 程序时常常会遇到这些情况:某个进程花费了过长的时间而导致在客户端过期.访问者已经放弃了对你的网站的访问而离开去了别的网站.或你的服务器上阻塞了大量的死队列时,系统出现 "Server is too busy" 错误信息. 当你在设计网站的过程中碰到这些问题时,一个有效的解决办法就是使用 Microsoft Message Queue (MSMQ) 来结束这些进程,让网站恢复正常! 到底 MSMQ 是个什么样的东西呢?我们下面作一下了解: 一. Microsoft M

了解MSMQ,控制ASP进程 (二)(转贴)

进程|控制 在运用程序中 MSMQ 可以有很多的运用,但是最普遍的运用是卸载另一个线程中的进程. ( 例如和 MSMQ 在同一台机器上的 IIS) 或则是另外一台机器上的 IIS. 通过卸载这些阻塞的进程,就能够使得 ASP 程序能够继续运行下去了. 一般来说,判断是否需要卸载任务进程要做两件事: 一是根据该进程运行的时间. 二是根据用户是否有回应(例如聊天室里面某个用户几个小时都没说话了). 例如:如果服务端的一个 Web 网页的任务花费了太长的时间 , 用户会得到一个网页超时的错误信息,我们

了解MSMQ,控制ASP进程 (一)

 我们在使用 ASP 程序时常常会遇到这些情况:某个进程花费了过长的时间而导致在客户端过期.访问者已经放弃了对你的网站的访问而离开去了别的网站.或你的服务器上阻塞了大量的死队列时,系统出现 "Server is too busy" 错误信息. 当你在设计网站的过程中碰到这些问题时,一个有效的解决办法就是使用 Microsoft Message Queue (MSMQ) 来结束这些进程,让网站恢复正常! 到底 MSMQ 是个什么样的东西呢?我们下面作一下了解: 一. Microsoft

[WCF权限控制]ASP.NET Roles授权[下篇]

为了让读者对基于ASP.ENT Roles授权方式有一个全面的认识,我们现在来做一个实例演示.在这个实例中,我们将采用不同的认证方式,包括Windows认证和证书认证(ASP.NET Membership + Roles为常见的组合方式,在这里就不多作演示).简单起见,我们依然沿用一贯的基于如下图所示的解决方案结构,并且依然采用声明式的授权.所以在服务操作方法Add上通过应用PrincipalPermissionAttribute特性指定其被授权的角色Administrators. 1: pub

如何控制其它进程应用程序的位置,窗口大小?

问题描述 如何控制其它进程应用程序的位置,窗口大小?由于项目需要,欲设计一个对话框程序,用来控制另外一个可执行程序启动时在显示器上的位置,大小,并屏蔽最大化,最小化按钮,并禁止窗体的移动?请问能否实现? 解决方案 解决方案二:http://blog.sina.com.cn/s/blog_593b4d50010009vm.htmlhttp://blog.sina.com.cn/s/blog_593b4d50010009wb.html解决方案三:不会,帮顶解决方案四:我也想了解,谢谢LZ.解决方案五

asp net 发布域控制-asp.net iis发布域登录控制

问题描述 asp.net iis发布域登录控制 企业内部使用了域管理,客户要求主页不需要域登录也能看到,但是除了主页之外的页面就需要 域登录成功才能看见. 现在我知道怎样实现域登录并获取登录用户域里面的信息,就是不知道怎样把主页剔除开来不需要域登录就能看见. 请各位不吝赐教!!

控制ASP.NET Web API 调用频率

很多的api,例如GitHub's API 都有流量控制的做法.使用速率限制,以防止在很短的时间量客户端向你的api发出太多的请求.例如,我们可以限制匿名API客户端每小时最多60个请求,而我们可以让更多的经过认证的客户端发出更多的请求.那么asp.net webapi如何实现这样的功能呢?在项目WebApiContrib 上面已经有了一个实现:https://github.com/WebApiContrib/WebAPIContrib/blob/master/src/WebApiContrib

求解,Applet控制windows进程

问题描述 现在要做个applet控制客户端的进程,请问可以吗?用那些API?客户机是Windows系统,主要是Applet载入的时候,把某个程序启动起来,然后Applet离开时,再把这个进程 杀掉,Applet在页面上其实是隐藏的,主要就实现上面功能就行了 问题补充:283433775 写道 解决方案 从理论上说通过 Runtime Process 这两个对象可以达到你所要的结果,但是事实上却不行,因为applet运行在安全模型中,浏览器是有所保护的,当访问到本地文件时会提示是否允许的.Java

[WCF权限控制]ASP.NET Roles授权[上篇]

在采用Windows认证的情况下,使用基于Windows用户组安全主体权限模式是一个不错的选择.我们可以直接使用现有的用户组设置,也可以为相应的应用或服务创建单独的用户组.但是,由于该模式对Windows认证的依赖,意味着这种模式只能使用于局域网环境中.如果采用证书和Windows帐号的映射,也可以适用于像B2B这样的外部网环境.在其他的网络环境中,基于Windows用户组的授权方式将会无能为力.此外,还具有这样一种状况:即使是在同一个局域网环境中,并且也采用Windows进行客户端认证,但是我