⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 209007.htm

📁 探索Windows 2000发展策略以及中介层技术设计的基本概念
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<html><body><span  id=Layer1><a name=209007><font color=#3e70d7 face=arial size=5><b>MSMQ与异动</span><span  id=Layer2></b></font><p><font size=2 color=#3c3c3c face=arial>虽然现今异动最常与资料库一起使用,但回想</span><span  id=Layer3>&nbsp;<a target='_new' href=207.htm#>第七章</span><span  id=Layer4></a>&nbsp;所谈异动处理,一般人使用资源管理员 (resource manager) 这个名词来谈论管理异动中所有变更的东西。而资料库管理系统并不是唯一的一个资源管理员,MSMQ也是。</span><span  id=Layer5></font></p><p><font size=2 color=#3c3c3c face=arial>MSMQ能充当资源管理员</span><span  id=Layer6></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=Layer7></font></p><hr><p><font size=2 color=#3c3c3c face=arial>要想感觉一下这意味着什麽以及为什麽这相当有用的话,想想在</span><span  id=Layer8>&nbsp;<a target='_new' href=201.htm#>第一章</span><span  id=Layer9></a>&nbsp;中所谈的QwickBank范例。在这个应用程式中,客户端要求banking这个COM物件可以修改一个或多个包含顾客帐户资讯的资料库。例如,呼叫MoveMoney method可以在两个帐户间转帐,并且修改资料库中帐户的馀额。回想一下,QwickBank的策略是超过$10,000的转帐就必须传送确认文件给顾客,而实作方式是让MoveMoney method送出一个MSMQ讯息到另一个系统来指明出现大金额转帐。那系统读取讯息、印出一封信并且寄出。这是一个说明讯息伫列用处的好例子,因为使用存款转帐的人不必费时等候这个要求被收到以及处理。</span><span  id=Layer10></font></p><p><font size=2 color=#3c3c3c face=arial>然而要求两件事都做-修改资料库中的帐户馀额以及送出要求确认的讯息-或者两件事都不做是完全合理的。当转帐交易失败了,顾客却收到确认大金额转帐的信件,那是毫无意义的。避免这种情况最简单的方法就是让转帐以及触发确认信件的MSMQ讯息送出动作隶属於同一个异动。</span><span  id=Layer11></font></p><p><font size=2 color=#3c3c3c face=arial>送出讯息是异动中工作的一部份</span><span  id=Layer12></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=Layer13></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在其他使用MSMQ的情况中,异动也是很有用的。因此,MSMQ提供多种支援异动的方式。然而,所有的方式都是基於异动伫列 (transactional queue) 的概念。</span><span  id=Layer14></font></p><font color=#3e72d7 face=arial size=4><b>异动伫列</span><span  id=Layer15></b></font><p><font size=2 color=#3c3c3c face=arial>想要伫列可以参与异动,必须在建立伫列的时候设定它的异动属性。一旦如此,这个异动伫列就可以充当DTC (与一个COM+应用程式,但是是间接的) 控制下的资源管理员。只有在异动中的应用程式才能送讯息到异动伫列,但即使不在异动中的应用程式也可以由异动伫列收到讯息。送到异动伫列的讯息有时被称为异动讯息 (transactional message),而它们含有特别的标记可以标明它们为异动的一部分。</span><span  id=Layer16></font></p><p><font size=2 color=#3c3c3c face=arial>异动伫列必须在建立时设定异动属性</span><span  id=Layer17></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=Layer18></font></p><hr><p><font size=2 color=#3c3c3c face=arial>MSMQ当然不会要求你在送收讯息时一定得使用异动。但你会发现,很多甚至是大部分,你的应用程式会要送讯息到异动伫列。最大的原因是:对於非异动伫列 (non-transactional queue),MSMQ并不保证讯息会依序传递或仅传递一次。换句话说,送到非异动伫列的一群讯息可能以不同於送出的顺序收到,而且其中一些讯息可能不只收到一次。如果是一个要求从你的QwickBank存款帐户扣款的讯息,传送两次绝不会是你所希望发生的。然而,对於异动伫列,MSMQ保证依序传递以及仅传递一次。在这种情况下,一次传送动作保证目的地伫列中只会出现一个讯息,而且MSMQ也保证会依你所想要的顺序送达所有的讯息。如果你知道你的讯息必须依序传递而且仅传递一次,很多应用程式有此需要,那就使用异动伫列吧。</span><span  id=Layer19></font></p><p><font size=2 color=#3c3c3c face=arial>异动保证依序传递以及仅传递一次</span><span  id=Layer20></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=Layer21></font></p><hr><font color=#3e72d7 face=arial size=4><b>MSMQ异动的种类</span><span  id=Layer22></b></font><p><font size=2 color=#3c3c3c face=arial>MSMQ应用程式有几种使用异动伫列的方法。要选择那一个全得看你的实际需求。本节会描述每个使用方法。</span><span  id=Layer23></font></p><p><font size=2 color=#3c3c3c face=arial><font size=2 face=arial color=#3e80d7><b>&nbsp;COM+异动</span><span  id=Layer24>&nbsp;</b></font>使用异动伫列最常见的方式是实作MSMQ应用程式为异动COM物件 (transactional COM object)。这样的话,应用程式会完全依赖DTC就像任何在COM+应用程式中的物件一样,如图9-4所示。图中省略了一些前几章已经描述过的细节,但基本概念是一样的。唯一的不同是MSMQ与DBMS都是资源管理员,而且会自动加入异动中。</span><span  id=Layer25></font></p><p><font size=2 color=#3c3c3c face=arial>COM+应用程式可以利用而在异动中送收讯息</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>COM+应用程式可以利用而在异动中送收讯息</span><span  id=Layer27></font></p><hr><br><center><a target=_new href=imagesh/9-4.gif><img border=0 src='imagesl/9-4.gif'></a></center></span><span  id=Layer28><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b>&nbsp;图9-4</span><span  id=Layer29>&nbsp;</b></font>MSMQ可以充当资源管理员,而由异动COM物件存取。</span><span  id=Layer30></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>想要更具体的例子,再想一下QwickBank应用程式:在帐户间移动钱的过程中,应用程式 (实作为COM已设定元件而且异动属性设为必需的) 修改资料库并且送讯息到异动伫列。如果一切顺利,COM物件呼叫SetComplete交付异动。交付异动引发两件事:DBMS永久地修改资料库,而MSMQ传送讯息。因为伫列标志为异动的,所以在异动完成前,伫列会扣留任何送到它的讯息。如果异动交付了,讯息被传送。如果异动复原 (roll back) 了,移出伫列中的讯息-讯息从未被传送。修改资料库与传送讯息不是都发生就是都不发生。前面已经提过,接收讯息的动作也可以是异动的一部分-如果异动交付的话,讯息永远由伫列中移除。然而,如果异动失败的话,讯息被送回伫列等候再次接收。</span><span  id=Layer31></font></p><p><font size=2 color=#3c3c3c face=arial>在这种情况下,COM物件总是会送收MSMQ讯息 (即使是对异动伫列的要求),而COM runtime会自行照料异动。这方法的缺点是必须将应用程式撰写为一个或多个COM物件,这有时是不恰当的。例如,如果应用程式希望接收动作也是异动的一部分的话,那麽就必须由已经在异动中的COM物件发出接收要求才行。这有时是难以达成的。尽管如此,还是会有大量的MSMQ应用程式以此方式建立。</span><span  id=Layer32></font></p><p><font size=2 color=#3c3c3c face=arial>一起使用COM+应用程式与异动伫列是相当普遍的</span><span  id=Layer33></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>一起使用COM+应用程式与异动伫列是相当普遍的</span><span  id=Layer34></font></p><hr><p><font size=2 color=#3c3c3c face=arial><font size=2 face=arial color=#3e80d7><b>&nbsp;DTC外部异动</span><span  id=Layer35>&nbsp;</b></font>应用程式可以自由地与DTC直接沟通,而不是由COM runtime与DTC沟通来开始和结束异动,如图9-5所示。这与使用DTC的其他应用程式并无不同。就像在</span><span  id=Layer36>&nbsp;<a target='_new' href=207.htm#>第七章</span><span  id=Layer37></a>&nbsp;中所说的,如果应用程式开发者了解OLE Transactions的话,它可以自行在明确定义的异动中送收MSMQ讯息。就像是DBMS,MSMQ扮演资源管理员角色。然而,了解以及使用OLE Transactions并不容易,这种使用方法并不常见。就像刚刚说过的,大部分情况下开发者会选择让COM runtime管理异动而不是自己做。</span><span  id=Layer38></font></p><p><font size=2 color=#3c3c3c face=arial>MSMQ应用程式可以直接使用DTC控制异</span><span  id=Layer39></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>MSMQ应用程式可以直接使用DTC控制异</span><span  id=Layer40></font></p><hr><br><center><a target=_new href=imagesh/9-5.gif><img border=0 src='imagesl/9-5.gif'></a></center></span><span  id=Layer41><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b>&nbsp;图9-5</span><span  id=Layer42>&nbsp;</b></font>MSMQ应用程式可以直接利用DTC来控制异动。</span><span  id=Layer43></td></table></font></center><p><font size=2 color=#3c3c3c face=arial><font size=2 face=arial color=#3e80d7><b>&nbsp;XA相容异动</span><span  id=Layer44>&nbsp;</b></font>还有另一个可能:假设你想在异动中使用MSMQ,但是你的异动协调者 (transaction coordinator) 不是DTC。这意味着你的应用程式正在使用一些非Microsoft的异动产品,但你希望MSMQ能加入它的异动中。在这种情况下,你还是会想要MSMQ充当资源管理员,而这是可能的。让我们来看看要怎麽做。记得在</span><span  id=Layer45>&nbsp;<a target='_new' href=207.htm#>第七章</span><span  id=Layer46></a>&nbsp;曾经提到,许多厂商的异动协调者支援标准的XA介面,可以与资源管理员沟通来完成异动。MSMQ不支援XA-它只认得Microsoft特有的OLE Transactions介面-但并不能说完全没有。除了异动协调者该有的功能外,DTC也能当作XA-to-OLE Transactions的转换器。如图9-6所示,藉由DTC的转换,不认得OLE Transactions的异动协调者还是可以包含MSMQ的操作在异动里。只要异动协调者认得XA,DTC转换器与MSMQ的组合就可以当作一个标准的XA相容的资源管理员。</span><span  id=Layer47></font></p><p><font size=2 color=#3c3c3c face=arial>可以把MSMQ看做与XA相容的资源管理员</span><span  id=Layer48></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b></b></font><p><font size=2 color=#3c3c3c face=arial>可以把MSMQ看做与XA相容的资源管理员</span><span  id=Layer49></font></p><hr><br><center><a target=_new href=imagesh/9-6.gif><img border=0 src='imagesl/9-6.gif'></a></center></span><span  id=Layer50><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b>&nbsp;图9-6</span><span  id=Layer51>&nbsp;</b></font>藉由DTC转换XA到OLE Transactions,可以把MSMQ看做XA相容的资源管理员。</span><span  id=Layer52></td></table></font></center><p><font size=2 color=#3c3c3c face=arial><font size=2 face=arial color=#3e80d7><b>&nbsp;MSMQ内部异动</span><span  id=Layer53>&nbsp;</b></font>最後,就如图9-7所示,MSMQ也支援内部异动。这选项不需依赖COM runtime、DTC、或任何不属於MSMQ的软体。因此,MSMQ内部异动并不包含任何需要其它资源管理员,例如资料库管理系统,来执行工作。MSMQ内部异动反而是将几个送收动作群组成一个单元。MSMQ自行确定这些动作全部发生或全部不发生。而因为确定仅传递一次的唯一方法是使用异动伫列,所以MSMQ提供一个特别的选择就是一个内部交易只做唯一的一次传送动作。那讯息保证仅传递一次,但是在这个异动中不能包含其他的操作。</span><span  id=Layer54></font></p><p><font size=2 color=#3c3c3c face=arial>内部异动由MSMQ自行提供</span><span  id=Layer55></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=Layer56></font></p><hr><p><font size=2 color=#3c3c3c face=arial>在这里「异动」这个词引发一些争议,有人觉得是误称,因为这个词通常暗示有把两个以上的动作群组在一起。因为MSMQ要求异动能保证讯息仅传递一次,不过允许异动中只有唯一的一个送出动作有时是必需的。而就MSMQ的观点,必需完成一个以上的动作来完成交易。</span><span  id=Layer57></font></p><hr><font face=Arial Black color=#3e77d7 size=3><b> 附注</b></font><p><font size=2 color=#3c3c3c face=arial>在这里「异动」这个词引发一些争议,有人觉得是误称,因为这个词通常暗示有把两个以上的动作群组在一起。因为MSMQ要求异动能保证讯息仅传递一次,不过允许异动中只有唯一的一个送出动作有时是必需的。而就MSMQ的观点,必需完成一个以上的动作来完成交易。</span><span  id=Layer58></font></p><hr><br><center><a target=_new href=imagesh/9-7.gif><img border=0 src='imagesl/9-7.gif'></a></center></span><span  id=Layer59><center><table border=0 ><td align=center><font color=#3c3c3c face=arial size=2><font size=2 face=arial color=#3e80d7><b>&nbsp;图9-7</span><span  id=Layer60>&nbsp;</b></font>MSMQ内部异动保证讯息传递,但不必依赖任何MSMQ之外的东西。</span><span  id=Layer61></td></table></font></center><p><font size=2 color=#3c3c3c face=arial>MSMQ会对送到异动伫列的每个讯息做一些相同的事情。例如,MSMQ把所有异动讯息的优先顺序属性值设为0。这是有意义的,因为MSMQ保证异动讯息会依序传递。如果讯息有不同的优先顺序,那麽讯息可能会以不同於传送的顺序被放入伫列内。MSMQ也设定异动讯息的传递属性值为可恢复,以确定即使系统当掉,讯息依然存在。而如果异动讯息无法传递,那麽讯息一定会被送到传送讯息的机器上之异动的无法投递的信件伫列 (transactional dead letter queue) 内。</span><span  id=Layer62></font></p><p><font size=2 color=#3c3c3c face=arial>能参与异动使得MSMQ更加有用。定义几个方法使得要了解它变得更具挑战性,但也增加使用异动伫列的情况。同样地,应用程式设计者得自己在该不该使用与复杂度之间做衡量。</span>
	</body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -