📄 209.htm
字号:
<html><body><span id=Layer1><p><font size=2 color=#3c3c3c face=arial>在概念上没有任何的通讯方式会比讯息伫列来得更加容易。使用讯息伫列的应用程式只需要建立一个讯息,并把它送入伫列就可以了。然後应用程式的其他部分(或者是其他的应用程式)便可以由伫列中读取讯息。必要的话,读取者可以再一次藉由传送讯息到某些伫列来回应。稍後,原讯息的传送者亦或是其他应用程式可以读取这个回应讯息。过程确实相当地简单。</span><span id=Layer2></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>讯息伫列是一个简单的想法</span><span id=Layer3></font></p><hr><p><font size=2 color=#3c3c3c face=arial>然而,真正建立一个应用程式时,你会想要用到很多特色,因此支援讯息伫列的产品所提供的功能通常比只是送收讯息还要来得更多。Microsoft Windows 2000内建的讯息伫列技术,Microsoft Message Queuing (MSMQ),就是这样的产品。它为讯息导向应用程式提供了功能广泛的特性。本章将描述随Windows 2000第一版出货的版本,MSMQ 2.0。</span><span id=Layer4></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>MSMQ不只是提供简单的讯息伫列服务而已</span><span id=Layer5></font></p><hr><p><font size=2 color=#3c3c3c face=arial>值得注意的是,使用MSMQ 2.0的系统功能和使用MSMQ 1.0的系统一同运作。但就如你所预期的一般,执行旧版本的机器将无法使用Windows 2000所提供的新特色。</span><span id=Layer6></font></p><a name=209001><font color=#3e70d7 face=arial size=5><b>何时该使用讯息伫列</span><span id=Layer7></b></font><p><font size=2 color=#3c3c3c face=arial>何时你应该在分散式的行程之间使用讯息伫列而非其他的通讯方式呢?抉择最常发生在COM/DCOM-一般行程之间或机器之间的通讯方式是采用远端程序呼叫(Remote Procedure Call,RPC)-与讯息伫列之间。在此提供一些简单的规则以帮助你决定何时应该使用何者:</span><span id=Layer8></font></p><font size=2 color=#3c3c3c face=arial><ul><font size=2 face=arial color=#3c3c3c><li>如果传送者继续执行工作之前必须等待接收者回应的话,你倒不如使用RPC,因为在传回结果之前此呼叫会被冻结住。一般而言,使用RPC会比讯息伫列容易些。所以,如果它符合需求的话,就用它吧(虽然将於</span><span id=Layer9> <a href=210.htm# target=_new>下章</span><span id=Layer10></a> 描述的Queued Components (QC)能使得讯息伫列的使用几乎就像RPC一样地简单)。然而,如果传送者不需等待结果而在这一段时间里能有效地做一些其他工作的话,讯息伫列会是较佳的选择。</span><span id=Layer11></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>当传送者不必等候回应时,使用讯息伫列</span><span id=Layer12></font></p><hr></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b> 附注</b></font><p><font size=2 color=#3c3c3c face=arial>在</span><span id=Layer13> <a href=205.htm# target=_new>第五章</span><span id=Layer14></a> 所描述,COM非同步method呼叫的加入,使得两者之间的差异渐趋模糊。</span><span id=Layer15></font></p><hr></font><font size=2 face=arial color=#3c3c3c><li>如果传送与接收的应用程式在不同的时间点执行的话,当然要使用讯息伫列-RPC假设客户端与接收端是同时存在的。如果硬体、软体、或网路错误的问题发生,讯息伫列能提供较佳的可靠性。因为讯息能安全地在伫列中等候,直到它们的目标接收者出现为止。</span><span id=Layer16></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>当传送者与接收者可能无法同时存在时,就使用讯息伫列</span><span id=Layer17></font></p><hr></font><font size=2 face=arial color=#3c3c3c><li>如果传送者并非传送讯息给特定的接收者,而是传送给某一群接收者中的任一个,那麽就使用讯息伫列。一旦讯息被放置在伫列中,任何能从伫列读取讯息的应用程式都有可能取得讯息。相对地,使用RPC的话,客户端通常会呼叫特定的伺服器(server),而且在发出呼叫的那一刹那就已经知道伺服器的身份了。</span><span id=Layer18></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>当要与一群接收者中任一个通讯时,就使用讯息伫列</span><span id=Layer19></font></p><hr></font><font size=2 face=arial color=#3c3c3c><li>若需稽核要求(request),而且可能要重新处理以便从错误中恢复,那麽就考虑使用讯息伫列。尽管有可能稽核以RPC为基础的应用程式,但这机制已然是内建於MSMQ的一部分。一如往常,利用Windows 2000系统所提供的服务,会比自己重新建立的相同功能执行时会来得有效些。</span><span id=Layer20></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>若需要稽核的话,则使用讯息伫列</span><span id=Layer21></font></p><hr></font><font size=2 face=arial color=#3c3c3c><li>如果你的客户端只是呼叫某个伺服端,由此伺服端取得回应、然後继续执行下去,使用RPC就够了。但是若你希望一个分散式应用程式的各部份之间能有较复杂的互动关系的话,那就使用讯息伫列。若使用MSMQ,A能送一个讯息到B、B再送给C和D、C和D两者都传送回应讯息给A。这是RPC所没有的弹性。</span><span id=Layer22></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>传送者与接收者之间需要复杂的互动的话,则使用讯息伫列</span><span id=Layer23></font></p><hr></font></ul></font><p><font size=2 color=#3c3c3c face=arial>把效能当作是选择MSMQ或RPC的考虑因素也是很不错的。由於RPC的要求与回应不需经由伫列,就这角度来看它的执行速度似乎应该比讯息伫列快一些。其实MSMQ与RPC的效能差异往往不是你作抉择的重要因素。MSMQ有时会快速地令人讶异。</span><span id=Layer24></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>讯息伫列相当快速</span><span id=Layer25></font></p><hr><p><font size=2 color=#3c3c3c face=arial>然而,比起以RPC为基础的COM与DCOM应用程式来说,讯息伫列增加更多管理上的负担。一旦你安装好适当的型态程式库(type library)、stub、以及proxy,这些类型的应用程式将可顺利运作,而不需要额外加以照料。使用一个讯息伫列应用程式就不是如此单纯了,它需要更多初始的组态动作,而且在应用程式使用时,管理者也可能会有周期性的工作要做。例如,某些种类的伫列会淤塞,因此可能需要定期以人工的方式来照料,以保持讯息程式能顺畅执行。</span><span id=Layer26></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>讯息伫列会增加管理上的负担</span><span id=Layer27></font></p><hr><p><font size=2 color=#3c3c3c face=arial>最後,不要把讯息伫列和电子邮件搞混了。这两者似乎非常相似 (通常统称为「讯息通讯」),但是这两者的目的却竭然不同。最简单的区别方式便是把电子邮件协定想像为人与人之间传送讯息的一种方式,而类似MSMQ的技术是为了在应用程式之间传送讯息而设计的。未来某些版本的产品,比如说Microsoft Exchange,理论上可能会建立在MSMQ的基础上,但电子邮件的标准协定早已就绪。从历史观察的结果,人与人之间以及应用程式与应用程式之间的讯息通讯技术上根深蒂固的区别还未有消弭的迹象。</span><span id=Layer28></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>讯息伫列是与电子邮件不同的技术</span><span id=Layer29></font></p><hr><a name=209002><font color=#3e70d7 face=arial size=5><b>MSMQ基础概念</span><span id=Layer30></b></font><p><font size=2 color=#3c3c3c face=arial>如图9-1所示,MSMQ主要的组成元件是:</span><span id=Layer31></font></p><font size=2 color=#3c3c3c face=arial><ul><font size=2 face=arial color=#3c3c3c><li>API,应用程式能用以传送讯息与接收讯息的API。MSMQ提供两组不同的API,而Windows 2000也引进了伫列元件(QC),QC可让你使用MSMQ,在客户端与COM元件之间转送呼叫。</span><span id=Layer32></li><br></font><font size=2 face=arial color=#3c3c3c><li>讯息,由应用程式建立,然後由应用程式传送与接收。</span><span id=Layer33></li><br></font><font size=2 face=arial color=#3c3c3c><li>伫列,由伫列管理员管理,讯息将被送入伫列,并从伫列接收。伫列管理员间可以相互沟通,以便将讯息从一个伫列传送到另一个伫列。</span><span id=Layer34></li><br></font></ul></font><p><font size=2 color=#3c3c3c face=arial>MSMQ由这些基本组件建构出叁种不同种类的系统,将分别於下个章节中描述。</span><span id=Layer35></font></p><font color=#3e72d7 face=arial size=4><b>MSMQ系统的种类</span><span id=Layer36></b></font><p><font size=2 color=#3c3c3c face=arial>如图9-2所示,叁种MSMQ系统中最完整的一种称之为MSMQ伺服器。MSMQ伺服器可以包含有伫列与伫列管理员、伫列的讯息路由软体...等等。它支援MSMQ API,也支援送收讯息的应用程式。如果在Windows 2000网域中使用MSMQ,那麽网域中至少要有一台网域控制主机(domain controller)上得执行MSMQ伺服器。</span><span id=Layer37></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>MSMQ伺服器提供伫列而且能转送讯息</span><span id=Layer38></font></p><hr><br><center><a target=_new href=imagesh/9-1.gif><img border=0 src='imagesl/9-1.gif'></a></center></span><span id=Layer39><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图9-1</span><span id=Layer40> </b></font>MSMQ应用程式藉由MSMQ API在伫列间传送讯息并从伫列中接收讯息。</span><span id=Layer41></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>MSMQ也定义了两种型态的客户端。独立客户端(independent client)支援MSMQ API,拥有伫列管理员(queue manager)以及自己的伫列。如果客户端现在连上网路,那麽执行在这机器上的应用程式所送出的所有讯息会马上被转交到MSMQ伺服器或目的地伫列之中。如果客户端没有连上网路-或许是在笔记型电脑上执行,而且你正试着在长途飞行途中完成某些工作-应用程式传送的讯息将会储存在客户端自己的伫列里。稍後当独立客户端连上网路时,它的伫列管理员会知道这件事,并且会将这些讯息自动地转交到它们的目的地。</span><span id=Layer42></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>MSMQ独立客户端拥有自己的伫列</span><span id=Layer43></font></p><hr><p><font size=2 color=#3c3c3c face=arial>最後,MSMQ也容许依存客户端 (dependent client)。就像独立客户端一样,依存客户端仅仅支援能传送与接收讯息的应用程式-它们不能充当讯息路由器。但依存客户端比独立客户端有更多的限制。因为它们仅仅支援MSMQ API,所以执行为依存客户端的应用程式必须事先连线上MSMQ伺服器。事实上,MSMQ伺服器实作代理功能完全是为了支援这些能力较弱的系统。预期依存客户端会拥有永久的网路连线,例如桌上型电脑连结到LAN上。依存客户端存在着一些限制,就像本章後面章节所描述的,但因为他们没有自己的伫列,所以管理全是依存客户端的MSMQ环境会比独立客户端环境来得简单些。</span><span id=Layer44></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>MSMQ依存客户端没有自己的伫列</span><span id=Layer45></font></p><hr><br><center><a target=_new href=imagesh/9-2.gif><img border=0 src='imagesl/9-2.gif'></a></center></span><span id=Layer46><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图9-2</span><span id=Layer47> </b></font>MSMQ定义了叁种不同型态的系统。</span><span id=Layer48></td></table></font></center><font color=#3e72d7 face=arial size=4><b>储存MSMQ资讯</span><span id=Layer49></b></font><p><font size=2 color=#3c3c3c face=arial>MSMQ 1.0在1997下半年发表,差不多是在Windows 2000有Active Directory之前。就像一些其他应用程式,一开始MSMQ提供它自己特有、以Microsoft SQL Server为基础的目录服务,称为MSMQ Information Store (MQIS)。在Windows 2000中,原保留在MQIS的MSMQ资讯则放置在Active Directory之中,所以MSMQ 2.0不再需要SQL Server了。</span><span id=Layer50></font></p><p><font size=2 color=#3c3c3c face=arial>在MSMQ 1.0中,MQIS协助客户端找到伫列、储存每个伫列的资讯...等等。在一台或多台MSMQ伺服器上保留有MQIS资料库的副本,任何变动情况发生时,会自动复制到这些副本中。但储存以及复制这类资讯正是目录服务的宗旨,所以MSMQ 2.0把所有资讯保存在Active Directory内。虽然现在已经不再使用MQIS了,但是程式开发者仍然会看到相同的介面。</span><span id=Layer51></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>MSMQ 2.0将伫列以及其他资讯存放在Active Directory</span><span id=Layer52></font></p><hr><p><font size=2 color=#3c3c3c face=arial>MSMQ也能使用在网域之外的系统中,那就是说,没有Active Directory的环境,例如工作群组。然而这会对MSMQ造成一些限制,在本章後面章节中再做描述。</span><span id=Layer53></font></p><a name=209003><font color=#3e70d7 face=arial size=5><b>了解伫列</span><span id=Layer54></b></font><p><font size=2 color=#3c3c3c face=arial>MSMQ基於两件事提供服务:伫列与讯息。了解它们就能透清楚地了解MSMQ负责的工作,以及能用它来做什麽。我们先看看伫列,下一节再来描述讯息。</span><span id=Layer55></font></p><font color=#3e72d7 face=arial size=4><b>伫列的类型</span><span id=Layer56></b></font><p><font size=2 color=#3c3c3c face=arial>MSMQ定义了两种伫列。第一种是应用程式伫列 (application queue),它由开发者所撰写的MSMQ应用程式建立、使用的。第二种是系统伫列 (system queue),由MSMQ自行建立、使用。应用程式伫列有四种类型:</span><span id=Layer57></font></p><font size=2 color=#3c3c3c face=arial><ul><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 讯息伫列</span><span id=Layer58> </b></font>(</span><span id=Layer59><font size=2 face=arial color=#3e80d7><b> Message queues</span><span id=Layer60> </b></font>) 应用程式利用它送收讯息。MSMQ使用者可以建立公用伫列或私人讯息伫列。如果能用Active Directory找寻到的话,那它就是一个公用伫列。否则的话,它就具有私人伫列的资格。公用伫列对於那些须让其他应用程式能找得到它们的伫列之应用程式而言是很有用的 (虽然其他应用程式可以透过目录找到伫列,但仍可设定伫列的安全性设定以拒绝他人存取,後面章节将做描述)。如果应用程式只会使用一组特定的伫列,而且没有其他程式需要使用这些伫列,那麽私人伫列大概会是较好的选择。</span><span id=Layer61></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>应用程式使用讯息伫列交换讯息</span><span id=Layer62></font></p><hr></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 回应伫列</span><span id=Layer63> </b></font>(</span><span id=Layer64><font size=2 face=arial color=#3e80d7><b> Response queues</span><span id=Layer65> </b></font>) 应用程式利用它传送回应讯息给其他程式。回应伫列通常只是一个普通的讯息伫列,用来指定任何回应讯息该传送到的地方。</span><span id=Layer66></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>应用程式经由回应伫列传送回应讯息</span><span id=Layer67></font></p><hr></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 管理伫列</span><span id=Layer68> </b></font>(</span><span id=Layer69><font size=2 face=arial color=#3e80d7><b> Administration queues</span><span id=Layer70> </b></font>) 用来放置MSMQ自己送出的认可讯息。认可讯息的种类在本章後面章节再做描述。</span><span id=Layer71></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>MSMQ传送认可讯息到管理伫列</span><span id=Layer72></font></p><hr></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 报告伫列</span><span id=Layer73> </b></font>(</span><span id=Layer74><font size=2 face=arial color=#3e80d7><b> Report queues</span><span id=Layer75> </b></font>) 用来追踪讯息的处理的情形。例如,应用程式可以要求MSMQ追踪讯息的路由情形,那麽MSMQ产生的追踪讯息会送到报告伫列里。然而,应用程式产生的讯息也可以送到报告伫列里,这就是为什麽报告伫列会被当作应用程式伫列而不是系统伫列的原因了。</span><span id=Layer76></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>应用程式或MSMQ可以传送伫列处理的追踪讯息到报告伫列</span><span id=Layer77></font></p><hr></font></ul></font><p><font size=2 color=#3c3c3c face=arial>第二种是系统伫列,包含两种不同用途的伫列,就是:</span><span id=Layer78></font></p><font size=2 color=#3c3c3c face=arial><ul><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 日志伫列</span><span id=Layer79> </b></font>(</span><span id=Layer80><font size=2 face=arial color=#3e80d7><b> Journal Queues</span><span id=Layer81> </b></font>) 用来放置应用程式所传送的讯息之复本,讯息复本由MSMQ产生。MSMQ提供两种不同的日志。每个MSMQ伺服器以及独立客户端会有一个机器日志 (machine journal),用来存放每一个传送到机器上的讯息之复本。每建立一个伫列也会同时产生一个关联的日志伫列,用来存放每一个由伫列移除的讯息之复本。两种日志伫列都是唯读的,而应用程式与MSMQ管理员控制要使用哪种日志。</span><span id=Layer82></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>MSMQ可以放置传送讯息的复本於日志伫列</span><span id=Layer83></font></p><hr></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 无法投递的信件伫列</span><span id=Layer84> </b></font>(</span><span id=Layer85><font size=2 face=arial color=#3e80d7><b> Dead letter queues</span><span id=Layer86> </b></font>) 如果讯息无法传递到目的地伫列,应用程式可以要求MSMQ把讯息放入无法投递的信件伫列里。应用程式可以决定是要把无法传递的讯息送到无法投递的信件伫列里,或者是直接删除掉。</span><span id=Layer87></li><br></font></ul></font><font color=#3e72d7 face=arial size=4><b>伫列的属性</span><span id=Layer88></b></font><p><font size=2 color=#3c3c3c face=arial>每个伫列都有一些属性。应用程式与MSMQ管理员设定属性值,用以控制伫列的独特用途以及运行方式。公用伫列的属性设定值存放在Active Directory里,而伫列所存在的机器上有一份暂存的复本。私人伫列的属性设定值则只存放在伫列所存在的机器上,它们并未储存在Active Directory里。伫列的属性可设有特定的使用权限,以允许不同的使用者对读取与修改属性值有不同的许可权。</span><span id=Layer89></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>伫列拥有属性</span><span id=Layer90></font></p><hr><p><font size=2 color=#3c3c3c face=arial>表9-1中条列出伫列所拥有的属性以及简短的描述。</span><span id=Layer91></font></p><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 表9-1 MSMQ伫列的属性</span><span id=Layer92> </b></font></td></table></font></center><center><table border=1><tr><th><font size=2>属性</span><span id=Layer93></b></font></td><th><font size=2>描述</span><span id=Layer94></b></font></td></tr><tr><td><font size=2>验证</span><span id=Layer95></font></td><td><font size=2>必须验证送到伫列的讯息吗 ?</span><span id=Layer96></font></td></tr><tr><td><font size=2>基本优先顺序</span><span id=Layer97></font></td><td><font size=2>伫列的优先顺序</span><span id=Layer98></font></td></tr><tr><td><font size=2>建立时间</span><span id=Layer99></font></td><td><font size=2>建立伫列的日期与时间</span><span id=Layer100></font></td></tr><tr><td><font size=2>例项</span><span id=Layer101></font></td><td><font size=2>辨识伫列的GUID</span><span id=Layer102></font></td></tr><tr><td><font size=2>日志伫</span><span id=Layer103></font></td><td><font size=2>必须将每个从伫列移除的讯息拷贝到日志 列吗 ?</span><span id=Layer104></font></td></tr><tr><td><font size=2>日志存放限制</span><span id=Layer105></font></td><td><font size=2>日志伫列的最大存放位元组数</span><span id=Layer106></font></td></tr><tr><td><font size=2>标签</span><span id=Layer107></font></td><td><font size=2>描述伫列的字元字串</span><span id=Layer108></font></td></tr><tr><td><font size=2>修改时间</span><span id=Layer109></font></td><td><font size=2>伫列属性最後被修改的时间</span><span id=Layer110></font></td></tr><tr><td><font size=2>路径名称</span><span id=Layer111></font></td><td><font size=2>伫列的名称</span><span id=Layer112></font></td></tr><tr><td><font size=2>DNS路径名称</span><span id=Layer113></font></td><td><font size=2>充当伫列名称的电脑DNS名称</span><span id=Layer114></font></td></tr><tr><td><font size=2>私密性等级</span><span id=Layer115></font></td><td><font size=2>送到伫列的讯息必须加密吗 ?</span><span id=Layer116></font></td></tr><tr><td><font size=2>存放限制</span><span id=Layer117></font></td><td><font size=2>指明伫列存放讯息的最大位元组数</span><span id=Layer118></font></td></tr><tr><td><font size=2>异动</span><span id=Layer119></font></td><td><font size=2>伫列是可异动的吗 ?</span><span id=Layer120></font></td></tr><tr><td><font size=2>类型</span><span id=Layer121></font></td><td><font size=2>使用者定义的GUID;能用来寻找伫列</span><span id=Layer122></font></td></tr></table></center><hr><font face=Arial Black color=#3e77d7 size=3><b> 附注</b></font><p><font size=2 color=#3c3c3c face=arial>考量与Windows系统管理工具的中译名词一致,本章中"transaction"皆翻译为「异动」。</span><span id=Layer123></font></p><hr><p><font size=2 color=#3c3c3c face=arial>有些伫列属性由MSMQ设定,MSMQ应用程式和管理员无法改变它们。除了这些属性以外,任何人都可以设定其他的属性,当然必须有适当的权限。这些属性中较重要的是:</span><span id=Layer124></font></p><font size=2 color=#3c3c3c face=arial><ul><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 路径名称</span><span id=Layer125> </b></font>(</span><span id=Layer126><font size=2 face=arial color=#3e80d7><b> Pathname</span><span id=Layer127> </b></font>) 这是建立伫列时唯一绝对要给定的属性。伫列的路径名称是指明伫列所在机器以及伫列名字的字元字串。例如在QwickBank公司中,某些应用程式所使用的伫列可以是「machine1.qwickbank.com\myqueue」。这属性一旦设定了便不能再改变。</span><span id=Layer128></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>每个伫列都有一个路径名称属性</span><span id=Layer129></font></p><hr></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 存放限制</span><span id=Layer130> </b></font>(</span><span id=Layer131><font size=2 face=arial color=#3e80d7><b> Quota</span><span id=Layer132> </b></font>) 指明伫列能存放讯息的最大位元组数量。如果伫列中讯息的总量已经到达存放限制,想要再传送讯息到伫列内便会失败。预设没有存放限制,而是允许伫列扩增直到机器空间用完为止 (MSMQ也允许为整台电脑设定存放限制-当作电脑的属性而不是伫列的属性。这个存放限制设定机器上所有伫列的位元组总量限制。超过的话,送到任何伫列的讯息都会被丢弃)。</span><span id=Layer133></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>存放限制属性控制着伫列所能包含的资料量</span><span id=Layer134></font></p><hr></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 日志</span><span id=Layer135> </b></font>(</span><span id=Layer136><font size=2 face=arial color=#3e80d7><b> Journal</span><span id=Layer137> </b></font>) 控制要不要将从伫列移除的讯息拷贝到MSMQ维护的日志伫列内 (日志是以日志伫列的方式实作,与所要记录的伫列位在同一台机器上)。选择日志将稽核所有移出伫列的讯息,MSMQ也允许稽核送出的讯息。为达此目的,必须设定每个送出讯息的一项属性,本章後面再做描述。MSMQ并不会自动清空日志伫列,所以需要某些周期性的管理动作以避免伫列被塞满。</span><span id=Layer138></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>日志属性控制着是否要将伫列内的讯息拷贝到日志伫列</span><span id=Layer139></font></p><hr></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 基本优先顺序</span><span id=Layer140> </b></font>(</span><span id=Layer141><font size=2 face=arial color=#3e80d7><b> Base priority</span><span id=Layer142> </b></font>) 用来决定讯息的路由。送到拥有较高优先顺序伫列的讯息会先被传送。只有公用伫列有此属性-私人伫列不支援伫列优先顺序。</span><span id=Layer143></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>基本优先顺序属性影响讯息的路由情形</span><span id=Layer144></font></p><hr></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 类型</span><span id=Layer145> </b></font>(</span><span id=Layer146><font size=2 face=arial color=#3e80d7><b> Type</span><span id=Layer147> </b></font>) 应用程式定义的GUID,以便用来在Active Directory中寻找伫列。例如,QwickBank的程式开发者可以为传送透支通知的伫列,定义一个特定的GUID。任何需要传送这类通知的应用程式便可以使用类别属性在Active Directory中找到这些伫列。这个方案可让应用程式不需事先知道伫列存在於哪一台机器上,而是藉由目录来找到这种伫列。</span><span id=Layer148></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>类别属性是用来找到特定种类的伫列</span><span id=Layer149></font></p><hr></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 标签</span><span id=Layer150> </b></font>(</span><span id=Layer151><font size=2 face=arial color=#3e80d7><b> Label</span><span id=Layer152> </b></font>) 用以辨识某个或某种伫列的字元字串。就像类别属性,应用程式可以指明特定值以便在Active Directory中寻找伫列。</span><span id=Layer153></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>标签属性也能用来找到特定种类的伫列</span><span id=Layer154></font></p><hr></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 私密性等级</span><span id=Layer155> </b></font>(</span><span id=Layer156><font size=2 face=arial color=#3e80d7><b> Priracy level</span><span id=Layer157> </b></font>) 如果伫列的私密性等级设定为「无」,则伫列只会接受未加密的讯息。如果伫列的私密性等级设定为「本文」,则伫列只接受加密的讯息 (利用本章後面描述的讯息属性)。如果设定为预设值「选项」,则伫列可同时接受未加密以及已加密的讯息。</span><span id=Layer158></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> 异动</span><span id=Layer159> </b></font>(</span><span id=Layer160><font size=2 face=arial color=#3e80d7><b> Transaction</span><span id=Layer161> </b></font>) 如果伫列设定了这个属性,那伫列就是可异动的,也就是伫列只能接收在异动中传送的讯息。在MSMQ中使用异动是非常重要的话题,本章後面将另辟章节讨论。</span><span id=Layer162></li><br></font><br><font size=2 color=#3c3c3c face=arial><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>异动属性决定了伫列是否可以参加异动</span><span id=Layer163></font></p><hr></font></ul></font><p><font size=2 color=#3c3c3c face=arial>您也可以为每个伫列定义使用权限 (access permission)。使用权限由安全性描述元 (security descriptor) 以及伫列的存取控制清单 (access control list,ACL) 来决定。ACL指明谁能送讯息到伫列、谁能由伫列接收讯息...等等。</span><span id=Layer164></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>每个伫列都有ACL控制着谁能存取它</span><span id=Layer165></font></p><hr></span><span id=Layer166><hr><font face=Arial Black color=#3e77d7 size=3><b> 附注</b></font><p><font size=2 color=#3c3c3c face=arial>在Windows 2000,伫列实际上是以记忆体对应档案 (memory-mapped file) 技术实作的,但单一档案可以包含来自几个不同伫列的讯息。因此,伫列的ACL与持有伫列讯息的档案之ACL是完全分开的。</span><span id=Layer167></font></p><hr><p><font size=2 color=#3c3c3c face=arial>只要有适当的权限,使用者可以自行更改伫列的安全性描述元,并能够详细地设定那些权限。例如,某个使用者可能有权检视讯息,但无移除讯息的权限。预设情况下,所有人都可以传送讯息到伫列内,如有必要,也可以限定只有某些人能够传送。</span><span id=Layer168></font></p><a name=209004><font color=#3e70d7 face=arial size=5><b>了解讯息</span><span id=Layer169></b></font><p><font size=2 color=#3c3c3c face=arial>就某方面而言,MSMQ讯息是非常简单的东西-它们只不过是一组属性罢了。因为MSMQ试着提供功能强大且富弹性的服务,所以每个讯息有很多属性,想要全盘了解并不容易。表9-2列出讯息的属性,其中忽略了只是包含其他属性的属性。本节最後描述几个最重要的属性。</span><span id=Layer170></font></p><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 表 9-2 MSMQ讯息属性</span><span id=Layer171> </b></font></td></table></font></center><center><table border=1><tr><th><font size=2>属性</span><span id=Layer172></b></font></td><th><font size=2>描述</span><span id=Layer173></b></font></td></tr><tr><td><font size=2>认可</span><span id=Layer174></font></td><td><font size=2>指出何种认可讯息应该被传送</span><span id=Layer175></font></td></tr><tr><td><font size=2>管理伫列名称</span><span id=Layer176></font></td><td><font size=2>送入认可讯息的伫列名称</span><span id=Layer177></font></td></tr><tr><td><font size=2>应用程式特有</span><span id=Layer178></font></td><td><font size=2>用来过滤收到的讯息</span><span id=Layer179></font></td></tr><tr><td><font size=2>到达时间</span><span id=Layer180></font></td><td><font size=2>讯息到达伫列的日期和时间</span><span id=Layer181></font></td></tr><tr><td><font size=2>验证</span><span id=Layer182></font></td><td><font size=2>MSMQ必须验证这个收到的讯息吗?</span><span id=Layer183></font></td></tr><tr><td><font size=2>验证延伸</span><span id=Layer184></font></td><td><font size=2>使用MSMQ 2.0的数位签章版本吗?</span><span id=Layer185></font></td></tr><tr><td><font size=2>验证等级</span><span id=Layer186></font></td><td><font size=2>讯息应该被数位签章吗?</span><span id=Layer187></font></td></tr><tr><td><font size=2>本文</span><span id=Layer188></font></td><td><font size=2>讯息内容</span><span id=Layer189></font></td></tr><tr><td><font size=2>本文类型</span><span id=Layer190></font></td><td><font size=2>讯息内容的类型</span><span id=Layer191></font></td></tr><tr><td><font size=2>类别</span><span id=Layer192></font></td><td><font size=2>讯息类型:标准、认可、报告</span><span id=Layer193></font></td></tr><tr><td><font size=2>连接器类型</span><span id=Layer194></font></td><td><font size=2>让应用程式,例如gateway,能设定一般由 MSMQ所设定的属性</span><span id=Layer195></font></td></tr><tr><td><font size=2>关联识别码</span><span id=Layer196></font></td><td><font size=2>关联识别码</span><span id=Layer197></font></td></tr><tr><td><font size=2>传递</span><span id=Layer198></font></td><td><font size=2>快递或可恢复</span><span id=Layer199></font></td></tr><tr><td><font size=2>目的地伫列</span><span id=Layer200></font></td><td><font size=2>送入讯息的伫列名称</span><span id=Layer201></font></td></tr><tr><td><font size=2>目的地对称金钥</span><span id=Layer202></font></td><td><font size=2>加密讯息的金钥</span><span id=Layer203></font></td></tr><tr><td><font size=2>加密演算法</span><span id=Layer204></font></td><td><font size=2>选择用来加密本文的演算法</span><span id=Layer205></font></td></tr><tr><td><font size=2>延伸</span><span id=Layer206></font></td><td><font size=2>用来与非MSMQ系统沟通</span><span id=Layer207></font></td></tr><tr><td><font size=2>第一个异动讯息</span><span id=Layer208></font></td><td><font size=2>这是异动的第一个讯息吗?</span><span id=Layer209></font></td></tr><tr><td><font size=2>杂凑演算法</span><span id=Layer210></font></td><td><font size=2>选择数位签章的杂凑演算法</span><span id=Layer211></font></td></tr><tr><td><font size=2>日志</span><span id=Layer212></font></td><td><font size=2>讯息要记录到日志伫列、送到无法投递的信件 伫列、或是都不要?</span><span id=Layer213></font></td></tr><tr><td><font size=2>标签</span><span id=Layer214></font></td><td><font size=2>应用程式为讯息定义的字元字串</span><span id=Layer215></font></td></tr><tr><td><font size=2>最後一个异动讯息</span><span id=Layer216></font></td><td><font size=2>这是异动的最後一个讯息吗?</span><span id=Layer217></font></td></tr><tr><td><font size=2>讯息识别码</span><span id=Layer218></font></td><td><font size=2>MSMQ为讯息产生的识别码</span><span id=Layer219></font></td></tr><tr><td><font size=2>优先顺序</span><span id=Layer220></font></td><td><font size=2>0到7之间的数值</span><span id=Layer221></font></td></tr><tr><td><font size=2>私密性等级</span><span id=Layer222></font></td><td><font size=2>讯息有加密吗?</span><span id=Layer223></font></td></tr><tr><td><font size=2>提供者名称</span><span id=Layer224></font></td><td><font size=2>在非MSMQ系统中的密码编译服务提供者</span><span id=Layer225></font></td></tr><tr><td><font size=2>提供者类型</span><span id=Layer226></font></td><td><font size=2>密码编译服务提供者的类型</span><span id=Layer227></font></td></tr><tr><td><font size=2>回应伫列</span><span id=Layer228></font></td><td><font size=2>送入回应讯息的伫列名称</span><span id=Layer229></font></td></tr><tr><td><font size=2>安全性内文</span><span id=Layer230></font></td><td><font size=2>包含安全资讯</span><span id=Layer231></font></td></tr><tr><td><font size=2>传送者凭证</span><span id=Layer232></font></td><td><font size=2>传送者的凭证</span><span id=Layer233></font></td></tr><tr><td><font size=2>传送者识别码</span><span id=Layer234></font></td><td><font size=2>讯息传送者的Windows 2000 SID</span><span id=Layer235></font></td></tr><tr><td><font size=2>传送者识别码类型</span><span id=Layer236></font></td><td><font size=2>传送者的识别码是SID或是null ?</span><span id=Layer237></font></td></tr><tr><td><font size=2>寄出时间</span><span id=Layer238></font></td><td><font size=2>讯息送出的日期和时间</span><span id=Layer239></font></td></tr><tr><td><font size=2>签章</span><span id=Layer240></font></td><td><font size=2>讯息的数位签章</span><span id=Layer241></font></td></tr><tr><td><font size=2>来源电脑识别码</span><span id=Layer242></font></td><td><font size=2>指明讯息来自那台电脑</span><span id=Layer243></font></td></tr><tr><td><font size=2>收到讯息的时间</span><span id=Layer244></font></td><td><font size=2>讯息必须被接收的最大时间限制</span><span id=Layer245></font></td></tr><tr><td><font size=2>到达伫列的时间</span><span id=Layer246></font></td><td><font size=2>讯息必须到达伫列的最大时间限制</span><span id=Layer247></font></td></tr><tr><td><font size=2>追踪</span><span id=Layer248></font></td><td><font size=2>控制是否传送追踪讯息</span><span id=Layer249></font></td></tr><tr><td><font size=2>版本</span><span id=Layer250></font></td><td><font size=2>传送者所使用的MSMQ软体版本</span><span id=Layer251></font></td></tr><tr><td><font size=2>异动识别码</span><span id=Layer252></font></td><td><font size=2>指出讯息所属的异动</span><span id=Layer253></font></td></tr><tr><td><font size=2>异动状态伫列</span><span id=Layer254></font></td><td><font size=2>容纳由非MSMQ系统所送的异动认可讯息</span><span id=Layer255></font></td></tr></table></center><font color=#3e72d7 face=arial size=4><b>讯息本文</span><span id=Layer256></b></font><p><font size=2 color=#3c3c3c face=arial>讯息属性中最重要的是本文。就如你所预料的,本文包含讯息传递的资料,而资料大小最多为4 MB。另一个属性指出讯息本文中资料的种类,这个属性是本文类型。本文有很多可能值包括整数、字元字串、二进位字串、以及其他。讯息本文的资料也可以是一个COM物件。例如,应用程式可以传送ADO Recordset当作MSMQ讯息内容,只要简单地把Recordset指定到本文属性就行了。</span><span id=Layer257></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>本文属性包含讯息的资料</span><span id=Layer258></font></p><hr><font color=#3e72d7 face=arial size=4><b>传递类型</span><span id=Layer259></b></font><p><font size=2 color=#3c3c3c face=arial>讯息的传递属性决定如何处理讯息以及如何在储存在伫列中。这属性有两个可能值:快递(Express)以及可恢复(Recoverable)。如果标记为快递传递,处理这讯息的所有伫列只把讯息存放在记忆体中-讯息不会被写入磁碟。快递讯息会非常快速地传递到目的地伫列,但要为速度付出代价。如果存放快递讯息的伫列所在电脑当掉了,快递讯息就都会遗失。</span><span id=Layer260></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>快递讯息相当快速,但机器当掉时就会遗失</span><span id=Layer261></font></p><hr><p><font size=2 color=#3c3c3c face=arial>相反地,可恢复(Recoverable)传递的讯息会写入磁碟。如果机器当掉,伫列中的可恢复讯息并不会遗失,因为讯息早已写入永续储存体中。MSMQ提供了选择,开发者必须自行在可靠传递与快速通讯之间作衡量。</span><span id=Layer262></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>可恢复讯息较慢,但机器当掉时不会遗失</span><span id=Layer263></font></p><hr><p><font size=2 color=#3c3c3c face=arial>一个使用可恢复讯息的明显情况是当MSMQ应用程式执行在独立客户端且未连上网路时。如果在重新连上网路之前关闭客户端 (例如,你的笔记型电脑),快递讯息会遗失。设定传递属性为可恢复,可以保证在重新连上网路之前应用程式的讯息会保存在本机磁碟内。</span><span id=Layer264></font></p><font color=#3e72d7 face=arial size=4><b>讯息的预设存留时间</span><span id=Layer265></b></font><p><font size=2 color=#3c3c3c face=arial>某些讯息是有时间性的。例如,如果在几秒钟之内没收到讯息的话,那也许应该把它丢弃比较好。MSMQ为这状况定义了一对讯息属性。收到讯息的时间属性值指定自讯息送出後可以存活的总秒数。如果没有应用程式在这段时间内接收这个讯息,那麽MSMQ会把它丢弃。同样地,到达伫列的时间指定讯息必须到达目的地伫列的总秒数。如果讯息不能即时到达-也许是到达伫列的唯一路径不通了-MSMQ会把它丢弃。</span><span id=Layer266></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>如果讯息太久不能到达目的地或是被收到,那它可能会被丢弃</span><span id=Layer267></font></p><hr><font color=#3e72d7 face=arial size=4><b>认可</span><span id=Layer268></b></font><p><font size=2 color=#3c3c3c face=arial>丢弃讯息的可能性引出另一个重点:传送者如何知道讯息最後怎麽了?哪些讯息正确地送达了?哪些讯息被丢弃?认可属性回答了这些问题。这个属性有五个可能值:</span><span id=Layer269></font></p><font size=2 color=#3c3c3c face=arial><ul><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> Full Reach Queue</span><span id=Layer270> </b></font>使得MSMQ自动送出一个认可讯息指出讯息已经到达目的地伫列,或是永远无法到达 (也许是超过了到达伫列的时间属性值、或是目的地伫列已经到达存放限制量、或是发生了其他错误)。如果讯息无法到达目的地,可能会送出几种不同的认可讯息,这完全取决於错误发生的确切原因。这使得传送者可以得知讯息无法到达伫列,以及到底是那里出了差错。</span><span id=Layer271></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> Full Receive</span><span id=Layer272> </b></font>使得MSMQ送出一个认可讯息指出讯息已经被接收,或是永远无法被接收 (也许是超过了收到讯息的时间 (Time To Be Received) 属性值)。</span><span id=Layer273></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> Nack Reach Queue</span><span id=Layer274> </b></font>使得MSMQ送出一个认可讯息指出讯息无法到达目的地伫列 (再说一次,也许是超过了到达伫列的时间(Time To Reach Queue)属性值或是其他原因)。</span><span id=Layer275></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> Nack Receive</span><span id=Layer276> </b></font>使得MSMQ送出一个认可讯息指出讯息无法被收到 (例如,超过了收到讯息的时间(Time To Be Received)属性值)。</span><span id=Layer277></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> None MSMQ</span><span id=Layer278> </b></font>不会送出认可讯息。如果传送者没有设定认可(Acknowledge)属性的话,这是预设值。</span><span id=Layer279></li><br></font></ul></font><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>MSMQ提供多种认可方式</span><span id=Layer280></font></p><hr><p><font size=2 color=#3c3c3c face=arial>MSMQ产生的所有认可讯息会传送到应用程式设定的管理伫列内。需要认可的话,传送应用程式必须提供每个送出讯息的管理伫列名称属性值,用来指定哪个管理伫列应该收到认可讯息。</span><span id=Layer281></font></p><font color=#3e72d7 face=arial size=4><b>讯息日志</span><span id=Layer282></b></font><p><font size=2 color=#3c3c3c face=arial>讯息伫列的一个好处就是很容易保有传送过讯息的记录。对高度要求审核效率的组织而言,例如本书虚构的公司范例-QwickBank,这是非常方便的。应用程式可以设定每个讯息的日志属性以决定要为讯息保留怎样的记录。如果属性值设为日志,那麽讯息的副本会被放入传送机器上的日志伫列。对已传送那些讯息感兴趣的应用程式可以来检查这个伫列。</span><span id=Layer283></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>日志属性使得保留每个送出讯息的副本在送出者所在机器的伫列内</span><span id=Layer284></font></p><hr><p><font size=2 color=#3c3c3c face=arial>为什麽收不到讯息呢?对设定日志属性值为无法投递的信件讯息而言,答案就在无法投递的信件伫列中。如果是丢弃送往非异动 (non-transactional) 伫列的讯息,那麽讯息会放入决定丢弃讯息的机器上的无法投递的信件伫列。如果是异动伫列,那麽讯息会放入送出讯息的机器上之异动的无法投递的信件伫列。最後,如果没设定的话,预设是不做任何事-当讯息传送时,它不会被记录在日志伫列中;如果讯息无法接收时,它也不会被转送到无法投递的信件伫列。</span><span id=Layer285></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>日志属性控制着无法传递的讯息是否要送到无法投递的信件伫列</span><span id=Layer286></font></p><hr><font color=#3e72d7 face=arial size=4><b>讯息的优先顺序</span><span id=Layer287></b></font><p><font size=2 color=#3c3c3c face=arial>通常,应用程式中某些讯息会比其他讯息来得重要些。例如在QwickBank的经纪人应用程式中,进行交易的讯息比只是查询股票现值优先,而且高额交易总是有更高的优先顺序。MSMQ清楚这个事实,所以让应用程式能设定每个讯息的优先顺序。优先顺序定义为0到7之间的整数值,数值愈高优先顺序愈高 (MSMQ预设讯息的优先顺序值为3)。当MSMQ做路由决定以及讯息插入伫列时,就会考虑到优先顺序。高优先顺序的讯息会插到伫列的前端,而不是按照讯息到达的次序。讯息路由会考虑到讯息的优先顺序,存於优先顺序属性的伫列优先顺序会先被考虑。</span><span id=Layer288></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>优先顺序属性会影响讯息被传送的顺序</span><span id=Layer289></font></p><hr><font color=#3e72d7 face=arial size=4><b>传送回应讯息</span><span id=Layer290></b></font><p><font size=2 color=#3c3c3c face=arial>当应用程式传送讯息到伫列,它可能也会期待得到某些回应。使用RPC-based的沟通机制,例如DCOM,由谁回应是相当明显的-COM runtime会追踪呼叫来自何方。然而,使用讯息伫列的话,如何回应传送者的讯息便不那麽明显了。毕竟,讯息的一项好处是不必明确知道谁会接收到讯息的能力。缺乏与应用程式的紧密连结,传送者要如何让接收者知道要如何回应呢?答案是使用MSMQ讯息的另一个属性。藉由设定回应伫列属性值,传送者可以通知接收者回应讯息要放在那里。并不要求一定得设定这个属性,某些应用程式宁愿使用预先定义好的一组伫列。不过它确实提供一个方便、标准的方式让讯息接受者能得知回应讯息该送往何处。(然而,请别搞混了,设定这个属性并不能强制接收者一定要回应。是否回应,与应用程式有关,与MSMQ无关。)</span><span id=Layer291></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>回应伫列属性包含回应讯息应送往的伫列名称</span><span id=Layer292></font></p><hr><p><font size=2 color=#3c3c3c face=arial>另一个相关问题是传送者如何连结回应讯息到引发回应的讯息?例如,假设送出十个讯息并且得到十个回应。并不保证收到回应的顺序会与送出相对讯息的顺序相同。为解决这个问题,送出讯息时,MSMQ会为每个讯息产生一个唯一的讯息识别码。传送者与接收者都能读取这个属性。需要的话,可以拷贝讯息识别码到回应讯息的关联识别码属性。记住,送出讯息的讯息识别码,再与收到讯息的关联识别码相比对,传送者就能找出讯息与回应的配对了。事实上,MSMQ处理认可属性的认可要求时便是这麽做的,拷贝原始讯息的讯息识别码到认可讯息的关联识别码。</span><span id=Layer293></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>关联识别码使得传送者得以决定它所要回应的讯息为何</span><span id=Layer294></font></p><hr><a name=209005><font color=#3e70d7 face=arial size=5><b>存取MSMQ</span><span id=Layer295></b></font><p><font size=2 color=#3c3c3c face=arial>MSMQ为应用程式提供了几种不同的存取方式。首先,有两组不同的API可以直接存取MSMQ。其一是针对C与C++程式开发者,定义为一组C函数。另一组是针对Microsoft Visual Basic、JAVA、甚至是C++程式开发者,定义为一组COM物件。两者都可用来建立、传送以及接收讯息,但C API可以存取更多的MSMQ服务。</span><span id=Layer296></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>MSMQ有C API以及COM API</span><span id=Layer297></font></p><hr><p><font size=2 color=#3c3c3c face=arial>MSMQ 2.0也提供另一个选择-伫列元件 (Queued Components,简写为QC)。QC使得应用程式能较容易地使用MSMQ当作底层机制来呼叫远端物件的method。QC不能使用MSMQ提供的所有特性,但它提供给开发者一个简单、自然的介面。</span><span id=Layer298></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>应用程式也能使用伫列元件存取MSMQ</span><span id=Layer299></font></p><hr><font color=#3e72d7 face=arial size=4><b>MSMQ API</span><span id=Layer300></b></font><p><font size=2 color=#3c3c3c face=arial>先来看看MSNQ的C API是有意义的,不只是因为它是功能最强大的选择,也是因为它提供了以COM为基础的API,以及QC的基础。C API中最重要的函数是:</span><span id=Layer301></font></p><font size=2 color=#3c3c3c face=arial><ul><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> MQCreateQueu</span><span id=Layer302> </b></font>在MSMQ伺服器或独立客户端建立一个新的伫列。这伫列可以在建立它的应用程式所在的同一机器上,也可以在其他的机器上。</span><span id=Layer303></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> MQDeleteQueue</span><span id=Layer304> </b></font>删除伫列。</span><span id=Layer305></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> MQOpenQueue</span><span id=Layer306> </b></font>开启一个已经存在的伫列。如前所述,在MSMQ 2.0中可以利用Active Directory找到公用伫列。</span><span id=Layer307></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> MQCloseQueue</span><span id=Layer308> </b></font>关闭伫列。</span><span id=Layer309></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> MQSendMessage</span><span id=Layer310> </b></font>传送讯息到特定的伫列。程式开发者指定讯息的属性值,然後传递它们当作函数的参数。</span><span id=Layer311></li><br></font><font size=2 face=arial color=#3c3c3c><li><font size=2 face=arial color=#3e80d7><b> MQReceiveMessage</span><span id=Layer312> </b></font>由特定的伫列接收讯息。讯息能以同步的方式读取,接收的应用程式会一直等到讯息到达 (或是应用程式设定的时间限制到了),或是以非同步的方式读取,应用程式经由回呼函数 (callback function) 或其他方式收到讯息到达的通知。应用程式可以取出讯息,这会将伫列中的讯息移除;或者检视讯息,应用程式可以检查讯息的属性但不会移除讯息。应用程式也可以选择只接收拥有某些属性的讯息,这不需要读取整个讯息。最後,藉由游标 (cursor) 的使用,应用程式可以检视以及接收目前不在伫列最上端的讯息。</span><span id=Layer313></li><br></font></ul></font><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>CAPI可以存取所有的MSMQ服务</span><span id=Layer314></font></p><hr><p><font size=2 color=#3c3c3c face=arial>使用C API的函数时,开发者必须先填好一些结构的值,然後传递它们当作函数的参数。这是建立讯息API的典型做法,所以MSMQ提供这种选择并不奇怪。如果你熟悉其他讯息产品的API,那你对这个MSMQ介面应该不陌生。</span><span id=Layer315></font></p><p><font size=2 color=#3c3c3c face=arial>MSMQ也提供一个更现代化的介面,一个以COM物件定义的介面。这个介面基本上是将MSMQ原有的C API包装为COM物件与介面,让开发者可以藉由设定物件属性和呼叫物件method来存取MSMQ的服务。</span><span id=Layer316></font></p><p><font size=2 color=#3c3c3c face=arial>例如,建立一个伫列可以使用MSMQQueueInfo物件。过程相当简单:开发者可以指定伫列的名称到MSMQQueueInfo物件的PathName属性,然後呼叫 (invoke) 物件的Create method。要开启这个新建的伫列,应用程式可以呼叫MSMQQueueInfo::Open。这个呼叫会传回一个MSMQQueue物件,这物件可以当作开启伫列的参考 (reference)。若要取得参考到已经存在伫列而不是新建伫列的MSMQQueue物件,应用程式可以使用MSMQQuery物件的LookupQueue method。这个method有各式各样的参数,应用程式可以设定特别的准则来寻找伫列。</span><span id=Layer317></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>COM API藉由一组COM物件显露出MSMQ的服务</span><span id=Layer318></font></p><hr><p><font size=2 color=#3c3c3c face=arial>要建造以及传送讯息的话,开发者先建立一个MSMQMessage物件、设定它的属性、然後呼叫它的Send method。至於讯息要送到那个伫列,是经由参数中的MSMQQueue物件决定。要接收讯息的话,应用程式同样呼叫一个适当的method,并以MSMQMessage物件为参数来指出接收那个伫列的讯息。如前所述,有很多接收讯息的方式可以选择,应用程式不一定要傻等讯息到达伫列。</span><span id=Layer319></font></p><font color=#3e72d7 face=arial size=4><b>伫列元件</span><span id=Layer320></b></font><p><font size=2 color=#3c3c3c face=arial>不管使用那种MSMQ API-C介面或COM-based介面-都要了解讯息伫列的基本传送/接收方式。对有经验的讯息程式开发者而言,这不是问题。撰写程式码来开启伫列、建立讯息、传送讯息、然後关闭伫列变得相当自然。但对较习惯RPC风格的开发者,例如COM开发者,经历这些步骤会令人觉得十分累赘。为什麽不让传送讯息就像呼叫COM物件method一样地简单呢?</span><span id=Layer321></font></p><p><font size=2 color=#3c3c3c face=arial>这就是QC要做的事。QC首次出现是在Windows 2000中,属於COM+的一部分。QC使得开发者可以使用MSMQ而不会看到传统的讯息伫列介面。取而代之的,开发者撰写呼叫COM物件method的程式码,而QC会处理利用MSMQ讯息来传递那些method呼叫的细节。</span><span id=Layer322></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>QC使得讯息伫列更像RPC</span><span id=Layer323></font></p><hr><p><font size=2 color=#3c3c3c face=arial>工作原理如图9-3所示。图中,客户端引发一个或更多的COM物件介面的method。然而,直到客户端使用完物件为止,没有method呼叫会真正送到物件。就QC所定义,所谓客户端使用完物件不是method呼叫所参与的异动确认了 (如果呼叫在异动内),就是客户端呼叫了介面指标的Release method。在这发生前,这些method呼叫的资讯就存放在一个QC元件内,称为</span><span id=Layer324><font size=2 face=arial color=#3e80d7><b> Recorder</span><span id=Layer325> </b></font>。</span><span id=Layer326></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Rcorder拦截客户端所做的呼叫</span><span id=Layer327></font></p><hr><p><font size=2 color=#3c3c3c face=arial>QC依赖标准的COM基础架构来执行参数包装(marshaling)动作,而不是强迫开发者了解讯息的资料格式。如此,呼叫能以MSMQ讯息的方式传送到目的地COM物件。另一端,包含目标物件的伺服端倾听进来的讯息,然後分派它们到另一个QC元件,称为Player。标准的COM marshaling再次被使用,而Player转换每个收到的讯息到对应的method呼叫。</span><span id=Layer328></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>Player发送呼叫到目标物件</span><span id=Layer329></font></p><hr><br><center><a target=_new href=imagesh/9-3.gif><img border=0 src='imagesl/9-3.gif'></a></center></span><span id=Layer330><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b> 图9-3</span><span id=Layer331> </b></font>使用QC,客户端可以藉由呼叫COM物件method来传送MSMQ讯息。</span><span id=Layer332></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>当然,使用MSMQ而不是COM的传统机制来转运method呼叫也衍生出一些限制。最重要的是,能透过这种方式引发的method只能有</span><span id=Layer333><font size=2 face=arial color=#3e80d7><b> in</span><span id=Layer334> </b></font>参数,而且不能有传回值。这应该一点都不令人感到意外;毕竟,如果客户端是一个异动的COM物件,呼叫method这个讯息必须等到物件所参与的异动结束後才会被传送。但由於及时启动 (just-in-time activation,JIT),结束异动也会将物件闲置(deactivate),所以即使讯息可以传送,但也收不到传回值了。重点是,QC是一种单向 (one-way) 的沟通方式。如果目标物件想要回应的话,它必须呼叫原始客户端所支援介面上的method或是以其他的方式传回资讯。双向 (two-way) 沟通需要有两条分开的单向路径。</span><span id=Layer335></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>QC所使用的介面只能有输入参数</span><span id=Layer336></font></p><hr><p><font size=2 color=#3c3c3c face=arial>能使用QC来呼叫的元件必须是已设定元件 (configured component)。那就是说,它们必须是COM+应用程式的一部份。就像其他的已设定元件一样,使用QC的元件可以利用COM基於角色的安全性机制做验证动作,即使物件不能模拟它们的客户端。让QC使用的介面中的method也必须遵循前面所述的规则-只能有</span><span id=Layer337><font size=2 face=arial color=#3e80d7><b> in</span><span id=Layer338> </b></font>参数而且不能有传回值。如果符合的话,介面的IDL可以标志为QUEUABLE,而是否以QC或是一般的COM机制呼叫method的决定在於元件的管理过程而不是元件的撰写过程。这会是相当方便的,因为这让相同元件可以利用QC也可以不利用QC,完全取决於如何设定元件。元件甚至可以在不同的时间有不同的行为,执行时才决定用DCOM或QC。</span><span id=Layer339></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>只有已设定元件可以使用QC</span><span id=Layer340></font></p><hr><hr><font face=Arial Black color=#3e77d7 size=3><b> 附注</b></font><p><font size=2 color=#3c3c3c face=arial>QC的客户端并不需要是COM+应用程式的一部分,但QC仍然必须存在客户端的机器上。这意味着那些客户端必须执行在Windows 2000系统上。</span><span id=Layer341></font></p><hr><p><font size=2 color=#3c3c3c face=arial>一些有撰写过讯息伫列应用程式的开发者可以毫无困难地使用MSMQ的API。但对日渐增
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -