?? 深入探討ejb中新的消息驅(qū)動組件(二).htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0057)http://eps.www85.cn4e.com/java/article/devshow.asp?id=198 -->
<HTML><HEAD><title>csdn_深入探討EJB中新的消息驅(qū)動組件(二)</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<STYLE type=text/css>TD {
FONT-FAMILY: "Verdana", "Arial", "宋體"; FONT-SIZE: 9pt
}
A {
COLOR: #660000; TEXT-DECORATION: underline
}
A:hover {
COLOR: #660000; TEXT-DECORATION: none
}
.line {
LINE-HEIGHT: 14pt
}
</STYLE>
<META content="Microsoft FrontPage 4.0" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff text=#000000>
<table><tbody>
<TR>
<TD height=21>
<DIV align=center><B><FONT size=3>深入探討EJB中新的消息驅(qū)動組件(二)
<BR><FONT size=2> </FONT></FONT>
<HR align=center color=#cccccc noShade SIZE=1>
</DIV></b></TD></TR>
<TR>
<TD class=line><FONT
color=#333300><BR><BR><BR> MessageDrivenBean容器服務(wù)<BR><BR> EJB容器提供了下列服務(wù),它們都是低級的EJB支持的服務(wù),不能直接被使用EJB1.1的JMS開發(fā)者使用。<BR><BR> 1.管理生命周期:<BR><BR> MessageDrivenBean的生命周期與配置它的EJB服務(wù)器的壽命是一致的,因為MessageDrivenBean是無狀態(tài)的,所以組件實例通常被EJB服務(wù)器集中起來,并且當一條消息變得對于作為消息消費者的主題或隊列可用的時候,會被容器取回,見圖5。<BR><BR><BR><BR><IMG
src="5926200110275445jt-2001-9-24-image005.gif" width="369" height="234"> <BR><BR> <BR><BR><BR> 2、處理異常:<BR><BR> MessageDrivenBean組件當處理消息的時候,可能不會拋出應(yīng)用程序異常,這就意味著可能被MessageDrivenBean拋出的唯一的異常指明一個系統(tǒng)錯誤的運行時間異常。容器將會處理這個異常,方法是刪除這個組件實例,并返回任何組件實例或容器啟動的事務(wù)處理。<BR><BR> 3、線程或并發(fā)性:<BR><BR> MessageDrivenBean實例是在一個單獨的控制線程中執(zhí)行,這將大大的簡化開發(fā)者的任務(wù)。EJB服務(wù)器將確保這一特性,另外,EJB服務(wù)器可能提供一種操作模式允許多消息被單獨的組件實例同時處理,這個配置選項實用定義在JMS規(guī)范中的“expert level”類。JMS提供者并不一定帶有這些類,所以EJB服務(wù)器可能不能利用每一種JMS實現(xiàn)的這種功能。<BR><BR> 4、事務(wù)處理:<BR><BR> 就像使用entity或session組件一樣,MessageDrivenBean組件也可以有“contain-or-bean-managed”(容器或組件管理)事務(wù)處理。一個事務(wù)屬性可以設(shè)置為MessageDrivenBean組件的onMessage()方法。因為沒有客戶端事務(wù)處理,所以只有一個事務(wù)處理屬性的子集考慮到entity和session組件與MessageDrivenBean組件有關(guān)系。使用了容器管理事務(wù)處理。容器將能支持MessageDrivenBean的Required和NotSupport事務(wù)處理屬性。一個帶有組件管理事務(wù)處理的MessageDrivenBean組件可以使用JTA UserTransaction對象。這個MessageDrivenBean組件在從onMessage()方法返回之前,必須先結(jié)束事務(wù)處理。onMessage()方法非常簡單,它帶有容器管理事務(wù)界限和NotSupported事務(wù)屬性。容器將不會創(chuàng)建事務(wù)并且組件開發(fā)者被禁止訪問 UserTransaction對象。<BR><BR> 更有趣的事,當onMessage()方法被指定了Required事務(wù)屬性,這時容器將創(chuàng)建一個全局事務(wù)處理收集任何可參考的資源并被傳遞到任何其他的正在處理消息的EJB服務(wù)器上。這是唯一一種JMS主題或隊列接口包含于EJB事務(wù)處理中的情景。<BR><BR> 對于使用Required事務(wù)屬性的組件,JMS服務(wù)器將成為XAResource,如果JMS服務(wù)器提供者不支持XA事務(wù)處理,JMS session通常將與容器的全局事務(wù)處理的結(jié)果同步。這樣,容器將不能包括用于管理分布事務(wù)的兩方面的委托處理的JMS服務(wù)器。JMS session的一個 rollback(反轉(zhuǎn))將警告 JMS服務(wù)器,消息應(yīng)當被重新發(fā)送。<BR><BR> 5、消息確認:<BR><BR> 容器總是處理MessageDrivenBean組件的消息收到的確認,對于組件來說,使用定義在 JMS規(guī)范中的客戶端消息收到確認方法是非法的。消息收到確認可以被設(shè)置為 DUPS_OK_ACKNOWLEDGE或 AUTO_ACKNOWLEDGE,前者允許在一次失敗之后投遞消息的副本,而后者提供一個嚴格的保證機制,確保消息只能被投遞一次。<BR><BR> 6、安全性<BR><BR> 因為MessageDrivenBean組件沒有客戶端,所以在接受消息的時候容器基本上不會產(chǎn)生安全問題。EJB2.0規(guī)范中為組件方法執(zhí)行一個聲明指定的功能提供了方便。因此,MessageDrivenBean組件可以被設(shè)置來確保用于傳送到其他正在處理消息的EJB服務(wù)器的安全。這就可以使MessageDrivenBean組件維護方法級安全性了。<BR><BR><BR><BR> 應(yīng)用程序服務(wù)器框架<BR><BR> 當 MessageDrivenBean提供的功能在應(yīng)用程序服務(wù)器內(nèi)被部署好后,它就會以指數(shù)形式膨脹開來。一個高端的應(yīng)用程序服務(wù)器提供可擴展性,負載平衡,動態(tài)應(yīng)用程序啟動,附加的 EJB服務(wù)器實例的動態(tài)配置以及容錯性,這些都是企業(yè)級應(yīng)用程序的核心要素。<BR><BR> 1、可擴展性: 企業(yè)級應(yīng)用程序服務(wù)器的一個關(guān)鍵元素就在它的提供一個結(jié)構(gòu)來適應(yīng)不斷增加的處理負載的能力。 隨著被 MessageDrivenBean處理的消息的數(shù)量的增加,應(yīng)用程序服務(wù)器的 EJB服務(wù)器必須使適應(yīng)這些增加而不會明顯的增加處理時間。一般是提供給多應(yīng)用程序服務(wù)器用于協(xié)調(diào)處理受到的消息的增多,這樣應(yīng)用程序服務(wù)器就有了可擴展性了。<BR><BR> 2、負載平衡:當一個請求發(fā)送到應(yīng)用程序服務(wù)器,一個負載平衡元素可以在實例之間平均分配負載(見圖六)。舉例來說,應(yīng)用程序服務(wù)器每個實例都可能包含一個EJB服務(wù)器的實例。使用應(yīng)用程序服務(wù)器的負載平衡特性,受到的消息就可以平均分配到所有的EJB服務(wù)器實例上了。<BR><BR><BR><IMG
src="15370200110275445jt-2001-9-24-6.gif" width="637" height="385"> <BR><BR>3、動態(tài)應(yīng)用程序啟動:應(yīng)用程序服務(wù)器應(yīng)當可以在負載增多時啟動附加的預(yù)先設(shè)置的實例。<BR><BR> 4、動態(tài)設(shè)置額外的EJB服務(wù)器實例:即使一個應(yīng)用程序被設(shè)定了固定的用于處理應(yīng)用程序負載的實例數(shù),但是也有可能信息流的激增造成系統(tǒng)處理速度變慢,為了處理這種情況,應(yīng)用程序服務(wù)器必須具有配置附加應(yīng)用程序?qū)嵗奶匦浴1热缯f,應(yīng)用程序服務(wù)器可以允許系統(tǒng)管理員動態(tài)定義附加的EJB服務(wù)器實例并把這些附加實例部署到EJB服務(wù)器中。負載平衡元素將利用這些補充的實例來處理消息。<BR><BR> 5、容錯性:一個企業(yè)級的應(yīng)用程序服務(wù)器必須也具有能夠適應(yīng)出錯的情況,像網(wǎng)絡(luò)或硬件上的問題,但是前提是不能明顯降低系統(tǒng)性能或是丟失數(shù)據(jù),應(yīng)用程序服務(wù)器使用的一種方法就是通過設(shè)置多應(yīng)用程序服務(wù)器實例來分配狀態(tài)信息,收到的消息通過智能化的負載平衡元素被分配到實例上。如果有一個或多個實例不能到達,負載平衡元素只要簡單的把消息重新分配給各個能用的實例就可以了。此外,負載平衡元素還可在管理組件的參與下重啟那些因為某些原因而不能使用的實例。<BR><BR> 超越JMS<BR><BR> EJB的MessageDrivenBean組件部分給企業(yè)級服務(wù)器領(lǐng)域又添了一員猛將,它允許消息經(jīng)由JMS接受在被一個簡單但又強有力的組件處理。然而,MessageDrivenBean的EJB組件事實上有能力變成能夠處理任何消息的組件模型,而不單是JMS服務(wù)器發(fā)來的消息。<BR><BR> JMS消息通過JMS實現(xiàn)被變成可交互操作,這就意味著JMS消息私地下是某一種特定的的實現(xiàn),但是內(nèi)容可以完全透明的被轉(zhuǎn)換成另一種特定的JMS實現(xiàn)而不會在任何方面影響消息消費者。因此任何消息格式都可以轉(zhuǎn)換成為JMS消息并被傳遞到MessageDrivenBean組件中。換句話說,一個MessageDrivenBean組件可以處理電子郵件、HTTP、FTP或其他任何協(xié)議發(fā)來的消息,以及又具有把這些協(xié)議轉(zhuǎn)化成為JMS消息的應(yīng)用程序服務(wù)器提供的消息。這就開啟了一個標準、簡單、輕便且能夠處理任何協(xié)議發(fā)過來的任何消息的能力的組件模型之門。如果消息被定義成為可開發(fā)的、可擴展的語言向XML這樣的及其強大的可交互操作在寬松連接系統(tǒng)以一種每個人都能理解的模式完成。下面我想簡單以一個獨立于協(xié)議以外的消息處理的例子來驗證一下這種技術(shù)的強大威力。<BR>一個B2B的例子<BR><BR> 一個典型的B2B情景就像一個“中樞-輪輻”形,多個寬松連接的商家(即“輪幅”)與一個大型企業(yè)(即“中樞”)交互連接,在某種情況之下,當執(zhí)行交互操作(像發(fā)送大的訂單這樣的事件)可以經(jīng)由JMS應(yīng)用程序在大企業(yè)與商家之間正常相互作用。對于一些小型商家來說,采用純JMS可能在成本上太高而負擔不起,它可能會采用通過Web瀏覽器中的HTTP或發(fā)送電子郵件的形式向大企業(yè)發(fā)送訂單。為了向客戶開放B2B系統(tǒng),大型企業(yè)級服務(wù)器就必須能夠處理這一系列不同的協(xié)議。<BR><BR><BR><IMG
src="18825200110275445jt-2001-9-24-7.gif" width="629" height="341"> <BR>而且,作為中樞的大型企業(yè)級服務(wù)器雖然接受來自email或來自JMS等不同類型格式的訂單,但是只有必要為每一種方式分別編寫處理程序。使用MessageDrivenBean組件,任何協(xié)議都可以發(fā)送以XML格式描述的訂單,如下面的例子。MessageDrivenBean組件只需要把注意力集中在處理來自應(yīng)用程序服務(wù)器發(fā)送的JMS TextMessage中的XML就可以了,而不要去關(guān)心到底所處理的消息時直接來自JMS服務(wù)器還是作為一條來自郵件服務(wù)器的SMTP消息。<BR><BR> 代碼段六:<BR><BR><purchase_order><BR><client_number>101</client_number> <BR><date>August 8, 2001</date> <BR><billing_address><BR><name>W(wǎng)ayne Zheng</name> <BR><address>xyz street</address> <BR><city>Hefei</city> <BR><province>Anhui</province> <BR><zip>230027</zip> <BR></billing_address><BR><shipping_address><BR><name>Zhang Tao</name> <BR><address>Huangshan Road</address> <BR><city>Hefei</city> <BR><state>Anhui</state> <BR><zip>230026</zip> <BR></shipping_address><BR><items><BR><item><BR><quantity>1</quantity> <BR><product_number>324</product_number> <BR><description>Java Book</description> <BR><unitcost>19</unitcost> <BR></item><BR><item><BR><quantity>1</quantity> <BR><product_number>532</product_number> <BR><description>Java VM</description> <BR><unitcost>56</unitcost> <BR></item><BR></items><BR></purchase_order><BR> <BR><BR> 小結(jié) <BR><BR> EJB2.0提供了一種新的組件模型-MessageDrivenBean組件-用來處理異步消息,MessageDrivenBean組件可以簡單的開發(fā)和利用與其他EJB組件模型相同的容器服務(wù),這種新的組件模型允許整合面向?qū)ο蟮闹虚g件(MOM)的、優(yōu)秀的以及新一代純Java的JMS。并且,MessageDrivenBean組件還有可能成為處理任何異步消息,特別是基于XML消息的工業(yè)標準。因此,MessageDrivenBean組件是EJB2.0中的非常重要的一員,本文只是初探其面目,以后我還會更加深入的探討其的功用。<BR><BR><BR></FONT></TD></TR>
<TR>
<TD height=5>
<HR align=center color=#cccccc noShade SIZE=1>
</TD></TR></TBODY></BODY></HTML>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -