以前收集的一些资料---在ASP中使用MSMQ解决进程死锁问题。

解决|进程|问题

            在ASP中使用MSMQ
当ASP程序因为某个进程花费了过长的时间而导致在客户端过期时,
当访问者已经放弃了对你的网站的访问而离开去了别的网站时。
或则你的服务器上阻塞了大量的死队列时,错误"Server is too busy"
发生了。
当你在设计网站的过程中碰到这些问题时,一个解决办法就是使用
Microsoft Message Queue (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.

MSQMQueueInfo
MSMQQueueInfo允许你新建,打开,删除队列中的消息.要和队列建立联系首先需要设置
PathName,这是一个命名队列的属性,它告诉MSQM是哪台机器上的队列。
    <%
     Dim objQueueInfo
     Dim objQueue
     Set objQueueInfo=Server.CreateObject("MSMQ.MSMQQueueInfo")
     objQueue.PathName = ".\MyQueue"
     Set objQueue = objQueueInfo.Open(MQ_SEND_ACCESS, MQ_DENY_NONE)
    %>
上面的代码打开一个叫MyQueue的本地队列.如果队列在另外一台服务器上,代码应该是这样的
    objQueue.PathName = "SomeOtherComputer\MyQueue"
打开队列中有两个参数:Access和ShareMode. Access表示将要对队列执行什么操作。
一般有三个操作:
MQ_PEEK_ACCESS (32), MQ_RECEIVE_ACCESS (1), MQ_SEND_ACCESS (2).
MQ_PEEK_ACCESS用来在特定的队列中查找消息。但对该消息不进行操作。
MQ_RECEIVE_ACCESS 用来在读取队列中的消息后删除它。
MQ_SEND_ACCESS is 用来在队列中发送消息,但不接收消息.
注意的是使用打开操作后返回了一个MSMQQueue对象.
下面是一个典型的新建和删除操作:
    <%
     Dim objQueue
     Set objQueue = Server.CreateObject("MSMQ.MSMQQueueInfo")
     objQueue.PathName = ".\MyQueue"
     objQueue.Create
    %>

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

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 = ".\MyQueue"
    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事件
当同步获取消息时,会一直等到消息可获取或则超时时程序才会不被挂起。
代码如下:

时间: 2024-08-30 08:52:03

以前收集的一些资料---在ASP中使用MSMQ解决进程死锁问题。的相关文章

以前收集的一些资料---使用ASP加密算法加密你的数据(二)

加密|数据|算法          以前收集的一些资料---使用ASP加密算法加密你的数据(二)Julain Sitkewich在第一部分,讨论了如何生成密钥,下面将介绍如何使用这个密钥来加密和解密一个字符串.下面的代码就是能够同时实现这个功能的函数Crypt.asp文件<% Dim g_Key Const g_CryptThis = "Now is the time for all good men to come to the aid of their country."Co

以前收集的一些资料---在Flash中使用ASP技术

                          在Flash中使用ASP技术   在Flash中使用ASP需要的条件:1.你的ISP的server必须支持Active Server Pages并且最好支持数据库2.你应该要安装Flash 43.需要你对ASP有初步的了解OK,下面具体介绍怎么使用:数据库结构:第一步要做的是建立数据库.例子中使用Access数据库,表名为tblStaff    有三个字段:strID (自动编号), strKnownAs(Text),strSurname (T

以前收集的一些资料---使用ASP的错误陷阱实现网站虚拟目录功能

错误|虚拟目录                 使用ASP的错误陷阱实现网站虚拟目录功能    我想大家一定都看见过在很多提供个人主页的网站上有这个虚拟目录功能.就是http://xxx.xxx.xxx/~Batman就会连接到我的主页上(假设我有这个主页,呵呵)    那么我们怎么使用纯粹的ASP技术来实现这个功能了,例如在chinaasp上如果联接是http://www.chinaasp.com/~Batman就会自动连接到与Batman有关的个人信息上呢?    下面将介绍一种使用ASP的

以前收集的一些资料---使用ASP编写农历算法(一)

农历|算法                  使用ASP编写农历算法              新年将近,呵呵,写了一个阴历和阳历的ASP程序,就当给大家的新年贺礼(呵呵,这下蓝先生满意啦把,就当我送给你的圣诞礼物把...)希望大家能够喜欢...大家可以很方便的将这个农历加入到自己的主页中中国人使用中国人自己的日历,呵呵,希望大家以后能够支持Chinaasp的共同进步...一共两个文件cal.asp和cal2.inc(主要是常量的定义)cal.asp代码如下<!--#include virtua

以前收集的一些资料---使用ASP方便的建立自己网站的每日更新

使用ASP方便的建立自己网站的每日更新每日更新是什么东东我想大家也都应该知道把,其实有点象现在很多新闻网站的更新,下面介绍如何让你的网站的内容每天自动更新下面的代码适用于:1.使用任何ODBC兼容的数据库2.很方便的插入到你现有的ASP程序中如何保存更新内容呢?数据库结构:(一共三个字段)QuoteID(Long ),Quote(String ),Author(String) 下面一个技巧是如何让更新显示在任意一个页面上呢?我们只要把更新内容和作者当返回值送给调用的页面即可.代码如下,其中log

以前收集的一些资料---使用ASP建立Http组件

生成HTTP组件自己动手,丰衣足食,下面介绍如何生成自己的AspHttp组件.使用Winsock控件,下面将介绍怎么来建立一个简单的HTTP组件.记住先选择mswinsck.ocx控件下面的代码是在VB6中编译的.代码如下:           Private WithEvents objWinSock As MSWinsockLib.Winsock          Private strURL As String          Private strURI As String      

以前收集的一些资料---使用ASP编写农历算法(二)

农历|算法 不知道大家去过www.renren.com没有,其中的农历其实就可以这样实现的...如果大家自己有兴趣的话,还可以给农历算法填加好多其他的功能...本程序的限制是只能够转换1950年到2050年之间的农历和公历...cal2.inc文件<%    Dim m_minyear    Dim m_maxyear    Dim NongLiDayName    Dim NongLiMonthName        m_minyear        = 1950    m_maxyear  

以前收集的一些资料---使用ASP推出你自己网站的频道

想自己生成自己站点的频道文件吗,看看下面的代码把.这只是个例子而已,但我想你完全可以根据它来建立你自己的频道.以后只要用户下载该.cdf文件,用户就能够订阅你的站点的频道了.                    <%                    '打开数据库连接,并定义用于格式化的变量.                    Set DBConn = Server.CreateObject("ADODB.Connection")                    

树型结构在ASP中的简单解决

解决|树型结构 树型结构在我们应用程序中还是很常见的,比如文件目录,BBS,权限设置,部门设置等.这些数 据信息都采用层次型结构,而在我们现在的关系型数据库中很难清淅表达.那么要在程序中遇到树型 结构问题该如何处理呢? 最近笔者通过一个ASP权限管理的程序轻松解决了一这问题,现在将其整理出来以飨读者. 首先,要将层次型数据模型转化为关系型数据模型.也就是说如何在我们的ACCESS,SQL SERVER ,ORACLE等关系型数据库中设计这个数据结构. 拿个实例来讲吧,譬如下面一个数据: 文档管理