选择显示字体大小

了解msmq,轻松控制asp进程


  到底 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 消息有两个方法和繁多的属性。其中两个最主要的属性是: body 和 label 。最主要的方法有 send 。有两种方法来获取消息: opening , peeking 。当使用 opening 方式后,该消息将会被删除掉;当使用 peeking 方式后,该消息仍然保存在队列中直到它过期。它们的返回值都是指向该消息的指针。下例的代码将打开一个消息,并显示其 body 和 label
private sub lookformessage()
dim objqinfo as new msmqqueueinfo
dim objqreceive as msmqqueue
dim objmessage as msmqmessage
objqinfo.pathname = ".\test"
set objqreceive = objqinfo.open(mq_receive_access, mq_deny_none)
set objmessage = objqreceive.receive(, , , 1000)
if not objmessage is nothing then
msgbox objmessage.label & " - " & objmessage.body
else
msgbox "nothing in the queue"
end if
objqreceive.close
set objqinfo = nothing
set objqreceive = nothing
set objmessage = nothing
end sub


   这段代码打开一个队列并在该队列中查找消息,使用 receive 方法,主要是设置一个 1000 微秒的超时 , 它告诉 msmq1000 微秒后停止查找设置一个非常段的超时的功能主要是用来检查是否存在消息而不是等候一个消息。也就是说如果你知识想看看是否有消息可以使用该方法。如果无消息,返回的指针为空 (if not objmessage is nothing) 。下面是发送一个消息的代码:
< %
dim objqinfo
dim objqsend
dim objmessage
set objqinfo = server.createobject("msmq.msmqqueueinfo")
objqinfo.pathname = ".\test"
set objqsend = objqinfo.open(mq_send_access, mq_deny_none)
set objmessage = server.createobject("msmq.msmqmessage")
objmessage.label = "this is the label."
objmessage.body = "this is the body."
objmessage.send objqsend
objqsend.close
set objqinfo = nothing
set objqsend = nothing
set objmessage = nothing
%>


   对于 msmq 的有关基本知识我们已做了举例介绍,下面将就它的具体运用进行的了解及探讨!


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons