国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)

2019-11-18 16:25:02
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明
原文地址:
http://www.onjava.com/pub/a/onjava/2003/08/27/cocktails.Html
中文地址:
http://www.matrix.org.cn/resource/article/43/43781_Jini_J2EE.html
關(guān)鍵詞: Jini J2EE Web

  

編輯說(shuō)明:Kathy Sierra 和Bert Bates是O’Reilly的Head First系列的后臺(tái)智囊。他們第一次寫這篇文章是在2003年Head First Java發(fā)行的那時(shí)候。這本書變得十分流行,我們現(xiàn)在仍然收到訂單。如此多的訂單讓我們決定重新帶給讀者,這就導(dǎo)致Head First Java,2nd Edition的發(fā)行。所以如果第一次發(fā)行的時(shí)候你沒(méi)趕上,現(xiàn)在就讓Kathy和Bert告訴你如何與Java初學(xué)者交談。

這些都是可以預(yù)測(cè)到的:當(dāng)你在一個(gè)宴會(huì)中,喝著次等的馬提尼酒,不可避免的就會(huì)談到分布式編程。怎么辦?放松點(diǎn),因?yàn)樵谶@里我們會(huì)解決3種最有意思的分布式編程,就在用完的餐巾上畫圖,你可以用來(lái)提高你的 whuffie. (不知道 whuffie是什么? 讀讀 Richard Koman's interview with Cory Doctorow.)

但是首先,萬(wàn)一你真的現(xiàn)在就在某個(gè)宴會(huì)上,我們首先從幾個(gè)即使你不懂Java也可以使用的短語(yǔ)。然后,對(duì)于那些確實(shí)知道一些Java技術(shù)的人,我們會(huì)談得更深入一點(diǎn)。

如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖一)

“什么是動(dòng)態(tài)發(fā)現(xiàn)?你知道,它的含義就是在網(wǎng)絡(luò)上,盡管客戶端和服務(wù)事先對(duì)對(duì)方一無(wú)所知,但能動(dòng)態(tài)地發(fā)現(xiàn)對(duì)方。這所有都是基于ip廣播的?!?br />
“什么是自動(dòng)診斷網(wǎng)絡(luò) (self-healing network) 呢?它指Jini網(wǎng)絡(luò)總是能夠反映當(dāng)前所有可用的服務(wù)的狀態(tài)--就像這樣:‘OK,這個(gè)服務(wù)起來(lái)了,那個(gè)服務(wù)當(dāng)?shù)袅恕瘺](méi)有任何人的管理!”

當(dāng)然,大多數(shù)路由器禁止了IP廣播,所以你不準(zhǔn)備在web上用Jini。但是Jini是為本地網(wǎng)絡(luò)的工作,或者本地網(wǎng)絡(luò)的集合而設(shè)計(jì)的,所以這并不是個(gè)大問(wèn)題。

“J2EE最酷的東西是提供商獨(dú)立,你可以專心于你的商業(yè)邏輯,將那些重?fù)?dān)交給廠商。你可以在你特殊的商業(yè)規(guī)則上工作,把那些安全,事務(wù),并行,持久化,甚至網(wǎng)絡(luò)代碼實(shí)現(xiàn)的任務(wù)交給服務(wù)器。而你只需要去學(xué)一個(gè)API,你可以重新部署你的J2EE程序給所有廠商的與J2EE兼容的服務(wù)器。所以現(xiàn)在廠商必須改變以前那種將你鎖起來(lái),并且你必須乞求廠商添加新的功能以解決bugs的方式?!?br />
“Web服務(wù)中酷的東西是…嗯,OK,也許現(xiàn)在的情況Web services沒(méi)有什么真正酷的東西。但是會(huì)變的,就在不久的未來(lái),當(dāng)所有標(biāo)準(zhǔn)都提出,工具成熟了,以及….”

“但是如果要說(shuō)Web 服務(wù)酷,這也許因?yàn)槟憧梢圆捎媚阋延械纳虡I(yè)程序,甚至舊的程序,讓他們通過(guò)xml那樣的接口暴露在Web上??蛻舳送ㄟ^(guò)可互操作的方式發(fā)送一個(gè)XML信息(通過(guò)一種叫SOAP的格式)給服務(wù)?!?br />
“安全和事務(wù)是現(xiàn)在Web服務(wù)的兩個(gè)明顯的缺陷,這意味著所有人必須加入自己的解決方案。在Web上沒(méi)有足夠的事務(wù)管理設(shè)置,而你所擁有的唯一的安全是互動(dòng)驗(yàn)證 (mutual authentication) 的Https。”

“Jini和J2EE都是Java技術(shù)。通過(guò)J2EE,就像規(guī)格說(shuō)明說(shuō)的那樣:“哦,你不需要擔(dān)心你這個(gè)小程序員去解決那些巨大的困難的東西。廠商會(huì)考慮這些問(wèn)題,而你可專注于自己的特殊領(lǐng)域的需要(比如,如何賣出更多的婦女內(nèi)衣)。但是,通過(guò)Jini,就好像規(guī)格說(shuō)明說(shuō)的那樣:‘你必須靠自己,別指望其他人使用許多基礎(chǔ)設(shè)施來(lái)救你。這是貧乏而又簡(jiǎn)陋的,寶貝,但你可以做最令人驚訝和體面的事情。當(dāng)你在那時(shí),檢驗(yàn)一下Javaspaces。’”

“Web服務(wù)不是針對(duì)于java的技術(shù),但是java可以讓其更容易的使用,特別是如果你去使用J2EE 1.4。不,你說(shuō)的對(duì)。J2EE 1.4還沒(méi)發(fā)布,但是會(huì)在今年年底發(fā)布,你將在2004年初見(jiàn)到許多廠商支持。”

(在我們繼續(xù)下去之前,先提出一些免責(zé)聲明:首先,如果你對(duì)于這篇文章的高級(jí)含義有任何問(wèn)題,重新讀一下標(biāo)題。對(duì)于這些內(nèi)容我們有酒吧侍應(yīng)的牌照,我們不會(huì)告訴你什么是錯(cuò)的,但是你也不會(huì)試圖去了解整個(gè)故事。每個(gè)主題都需要相應(yīng)的一本書(但如果我們不說(shuō)出任意一本書來(lái),這是很可恨的。比如,Head First EJB,或是哪一本呢?)讓我們僅僅通過(guò)雞尾酒會(huì)的觀點(diǎn)來(lái)看這個(gè)問(wèn)題并不是你想來(lái)操縱你的下個(gè)結(jié)構(gòu)。(我們知道你知道這些,但對(duì)于那些可能會(huì)誤解這篇文章是篇嚴(yán)肅的技術(shù)論文的人,我感到有必要談?wù)勎覀兊腶**es).)[原文如此]

所以現(xiàn)在是時(shí)候進(jìn)入下一個(gè)層次了。我們將首先開(kāi)始看看什么是服務(wù),而且更重要的是如何向別人顯現(xiàn)你自己。換種說(shuō)法,你如何將你的服務(wù)告訴你潛在的客戶呢?

如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖二)

通過(guò)Jini,J2EE,和Web service,目的是讓客戶去訪問(wèn)服務(wù)。什么是服務(wù)呢?你所能做的事就是將消息從一個(gè)軟件傳遞給另一軟件(也許包含人工指向,也許也不包含)。你也許有一個(gè)為基因匹配進(jìn)行大規(guī)模計(jì)算的服務(wù)?;蛘咭粋€(gè)玩簡(jiǎn)陋的Go游戲的服務(wù)?;蛘咭粋€(gè)讓你買演唱會(huì)門票的程序?;蛘哳A(yù)定異國(guó)熱帶風(fēng)情的巡游?;蛘呱踔翆⒛愕奈淖謧鬟f給一臺(tái)高容量(high-volume)打印機(jī)。換種說(shuō)法,服務(wù)就是所有像軟件一樣開(kāi)始但是結(jié)果并不一定留存在軟件中的東西。

你也許有個(gè)服務(wù)來(lái)移動(dòng)攝像機(jī),利用打印機(jī)打印,撥電話。沒(méi)關(guān)系?;蛘咧辽?zèng)]關(guān)系。主要目標(biāo)之一,就像OO的任何情況下的目標(biāo)一樣,盡可能減少耦合,—此例中,即客戶端和服務(wù)器端之間的耦合。換種說(shuō)法就是我們要讓那些參與者(客戶端和服務(wù)端)盡可能地少了解對(duì)方。

但是讓我們說(shuō)說(shuō)你有一個(gè)服務(wù)…現(xiàn)在怎么辦?客戶端如何找到你?如果他們找到你,他們?cè)趺粗滥愕姆?wù)可以干什么?換種說(shuō)法,他們?nèi)绾沃浪麄冋{(diào)用你的服務(wù)的方法?這樣,你必須將你自己暴露給客戶,我們的3種技術(shù)在這方面稍有不同。不考慮我們?cè)谟懻揓ini,J2EE,或者Web服務(wù),可是必須在某個(gè)地方有個(gè)接口。這個(gè)接口說(shuō)明了你可以做的東西。

進(jìn)入討論組討論。
服務(wù)接口

作為一個(gè)服務(wù)開(kāi)發(fā)人員,你必須告訴人們你的服務(wù)可以做什么?;蛘哒f(shuō),你必須聲明你的服務(wù)的方法。這包括聲明客戶端傳遞給你的方法什么(參數(shù))以及服務(wù)返回什么(返回類型)。

如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖三)


上面這個(gè)接口是為一個(gè)叫Advice的服務(wù)。它具有一個(gè)方法,getAdvice()。你可以調(diào)用這個(gè)方法,得到一個(gè)字符串,里面包含極好的有用的隨機(jī)選擇的建議。(我們選擇不在我們假的小類似于UML的圖中顯示返回類型。這是非常小的事)。

對(duì)于Jini和EJB(EnterPRise JavaBeans---J2EE的核心和靈魂),接口通常是Remote。一個(gè)Remote的接口通常意味著開(kāi)發(fā)者寫一個(gè)基于java.rmi.Remote的擴(kuò)展java接口。耶,Remote所有方法(意思是Remote接口中的所有方法)必須聲明一個(gè)java.rmi.RemoteException的異常。一個(gè)強(qiáng)制性的異常(checked exception),告訴客戶端:“事情變得很糟糕,小心準(zhǔn)備。”

如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖四)

對(duì)于Web Services,接口被定義在一個(gè)WSDL中(讀作“wizdle”,與“fizdle”押韻)----一種特殊格式的XML文檔。所以總括來(lái)說(shuō),你可以在隨意的談話中說(shuō)以下這段話:

“可以說(shuō),在jini和ejb中,你通過(guò)java接口暴露你自己,但是在web服務(wù)中,你通過(guò)xml接口暴露你自己。”

(準(zhǔn)確地說(shuō),如果你是一個(gè)java開(kāi)發(fā)者,你通過(guò)寫一個(gè)java接口來(lái)創(chuàng)建WSDL,按那個(gè)在你的開(kāi)發(fā)工具中神奇的紅色按鈕,將你的java接口變成XML WSDL。這就夠了,像他們說(shuō)的,這超過(guò)了一個(gè)雞尾酒會(huì)談話的范圍。)

如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖五)

OK,現(xiàn)在我們有了服務(wù),有了暴露我們服務(wù)的接口。現(xiàn)在呢?客戶端如何知道這個(gè)接口?他們?nèi)绾握嬲〉眠@個(gè)接口,他們還需要和我們服務(wù)交流些什么呢?這要看服務(wù)的類型。這3種類型是不同的。你訪問(wèn)Jini,J2EE和Web服務(wù)將有少許不同,文章的其他部分將著重于一些細(xì)節(jié)和主要不同之處。

首先,讓我們從一些Java的Remote Method Invocation(RMI)的背景開(kāi)始。這是大部分的java分布式技術(shù)的主干,Jini和EJB都基于此。事實(shí)上,自從所有分布式技術(shù)在概念上如RMI的技術(shù)上運(yùn)行時(shí),你在這里了解的東西將幫助你弄清楚整個(gè)分布式的世界,Java或者非Java的。

如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖六)

通過(guò)RMI,你寫你的服務(wù)并將此變成為Remote對(duì)象。讓其成為Remote僅是小菜一碟---寫分布式接口,創(chuàng)建Remote類來(lái)實(shí)現(xiàn)它。

進(jìn)入討論組討論。
創(chuàng)建remote接口

1.        擴(kuò)展 java.rmi.Remote
2.        為每個(gè)方法聲明java.rmi.RemoteException
1.        public interface Advice
2.        extends java.rmi.Remote {
3.        
4.           String getAdvice() throws
5.           java.rmi.RemoteException;
6.        
7.        }


創(chuàng)建remote類
1.        實(shí)現(xiàn)你的Remote接口
2.        為接口方法寫真正的商業(yè)邏輯
1.        public class AdviceImplementation implements Advice {
2.        
3.           public String getAdvice() {
4.        
5.           // monumentally important
6.            business logic here
7.        
8.          }
9.        
10.        }




(OK,所以代碼對(duì)于雞尾酒會(huì)有點(diǎn)多,因?yàn)樵谶@都是初學(xué)者….)
所有東西的關(guān)鍵:The Stub

當(dāng)你已經(jīng)有了接口和類,你通過(guò)RMI編譯器(rmic)運(yùn)行你的類,RMI編譯器已在J2SE中(如果你已經(jīng)有javac,你就有rmic了)。那個(gè)程序建立了stub這個(gè)你可以幾乎在所有現(xiàn)代分布式編程模型中發(fā)現(xiàn)的東西。Stub僅是客戶端的助手,通過(guò)像服務(wù)那樣實(shí)現(xiàn)遠(yuǎn)程接口來(lái)扮演遠(yuǎn)程對(duì)象的角色。但是事實(shí)上,Stub僅是一個(gè)取得方法調(diào)用,打包,并通過(guò)網(wǎng)線傳遞給真正的遠(yuǎn)程對(duì)象的小對(duì)象?;蛘哒f(shuō), stub知道如何打電話回家并叫真正的服務(wù)去做真正的工作。

Stub所有方法都是虛假的。他們是方法,有一大堆代碼,包括用于服務(wù)聯(lián)系的網(wǎng)絡(luò)和I/O內(nèi)容。但是他們并不是真正的商業(yè)代碼。所以對(duì)于Advice服務(wù), stub有g(shù)etAdvice()方法,但是這個(gè)方法僅僅從客戶的請(qǐng)求傳遞給在服務(wù)器上真正的AdviceImplementation。

那邊,客戶端假裝他在調(diào)用遠(yuǎn)程對(duì)象,但是我們知道由于遠(yuǎn)程對(duì)象運(yùn)行于不同的JVM堆中這并不真正發(fā)生。

(是的,在服務(wù)器端依然有些東西接受來(lái)自客戶的Socket連接,解包方法調(diào)用,打包并裝載返回值等等。但是我們并不準(zhǔn)備在這篇文章中談?wù)撨@些。那是個(gè)更微不足道的過(guò)程,因?yàn)槟悴恍枰獡?dān)心傳遞功能給客戶。所以在服務(wù)器上Stub的功能有同伴,但是你并不需要擔(dān)心這個(gè)。)

RMI基本結(jié)構(gòu)

籍由rmi,遠(yuǎn)程對(duì)象是一個(gè)服務(wù)。

如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖七)

點(diǎn)擊查看大圖
進(jìn)入討論組討論。
暴露rmi

如果你有個(gè)客戶端,你想通過(guò)遠(yuǎn)程服務(wù)(或者說(shuō)遠(yuǎn)程對(duì)象)做些東西,你必須有遠(yuǎn)程服務(wù)的接口(在編譯時(shí)和運(yùn)行時(shí)),而且你必須有stub對(duì)象(運(yùn)行時(shí))。記住,是Stub真正知道如何傳遞你的方法調(diào)用給遠(yuǎn)程對(duì)象(并傳遞回返回值),所以你可不能沒(méi)有它。很多時(shí)候,你將從服務(wù)開(kāi)發(fā)者那得到接口和stub .class文件。

但是有個(gè)更酷的方式運(yùn)行時(shí)取得stub類而不需要在運(yùn)行前取得,那就是通過(guò)一個(gè)叫動(dòng)態(tài)代碼下載(Dynamic code downloading)的進(jìn)程。這是你在java中可以使用的最強(qiáng)大的東西之一,而且也不難。但是,你也可以以守舊的方式從開(kāi)發(fā)者的Email中取得stub類文件,或者從別人那里下載到你的電腦。

查找服務(wù)(例如擁有stub,這樣你可以調(diào)服務(wù)中的商業(yè)方法)

在RMI中,你通過(guò)RMI登記(附在J2SE中)查找到stub。RMI登記就像一本小的電話簿,你找到名字,然后就得到stub。記得當(dāng)stub對(duì)象過(guò)來(lái)的時(shí)候是串行化的。這意味著在其來(lái)到客戶端時(shí)要使其反串行化。同時(shí)為了讓其工作,the stub類必須在當(dāng)前的classpath中或者可以用動(dòng)態(tài)代碼下載來(lái)找到。這是java基本知識(shí)---一個(gè)實(shí)例不能在沒(méi)有其類時(shí)反串行化。

如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖八)

發(fā)現(xiàn)查找服務(wù)(rmi Registry)

通過(guò)RMI,你必須知道the stub在哪里?你必須為RMI Registry知道IP地址和TCP端口號(hào)(同時(shí)也恰好是遠(yuǎn)程對(duì)象/服務(wù)所在的服務(wù)器那里)。事實(shí)上我們大概并不一定要知道端口號(hào),因?yàn)橛心J(rèn)的端口號(hào),但是如果服務(wù)部署人員更改了,你則需要知道??蛻舳酥蛔隽撕?jiǎn)單的單行的查找,利用靜態(tài)方法(java.rmi.Naming.lookup()),這時(shí)奇跡發(fā)生了,它有了一個(gè)即時(shí)的反串行化的stub。對(duì)象知道如何打電話回家了。

如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖九)

現(xiàn)在我們已經(jīng)注意RMI,這部分將會(huì)更有意義。Jini就像是Extreme RMI。我們這里用Extreme這個(gè)詞是指其運(yùn)動(dòng)含義,而不是XP中的意思。

動(dòng)態(tài)發(fā)現(xiàn):服務(wù)和查找服務(wù)如何發(fā)現(xiàn)對(duì)方

這是普通的RMI與Jini差別最多的地方。在RMI中,客戶端必須知道很多東西,服務(wù)必須通過(guò)RMI Registry清楚地登記(用邏輯名稱),注冊(cè)必須在與服務(wù)的同個(gè)機(jī)器中。

但是通過(guò)Jini,所有東西僅是在那兒,在某處。沒(méi)有人知道除了接口外的其他東西。這里有句話關(guān)于這個(gè)的,我們發(fā)現(xiàn)這放在這個(gè)對(duì)話中的戰(zhàn)略時(shí)刻相當(dāng)有意義。

“通過(guò)jini,服務(wù)通常嘗試去發(fā)現(xiàn)查找服務(wù),客戶端也通常發(fā)現(xiàn)查找服務(wù),而查找服務(wù)通常在讓服務(wù)和客戶端知道他們(查找服務(wù))就在這。所有都是自動(dòng)的。”

如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖十)
如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖十一)
如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖十二)
如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖十三)

雖然在Jini中你也可以將整個(gè)服務(wù)發(fā)送給客戶端本身,而不是讓服務(wù)變成服務(wù)器上100%的遠(yuǎn)程對(duì)象,但是基本的Jini結(jié)構(gòu)采用RMI。當(dāng)客戶端要求服務(wù)的參考時(shí),將取得遠(yuǎn)程對(duì)象的stub(如果服務(wù)被實(shí)現(xiàn)為一個(gè)遠(yuǎn)程對(duì)象),或者重新得到整個(gè)該死的服務(wù),在上面進(jìn)行簡(jiǎn)單的舊的本地調(diào)用。事實(shí)上,通過(guò)Jini,客戶端甚至可以一個(gè)混合體或者“智能代理”(公開(kāi)說(shuō)這句話會(huì)有特別的聲望)。--那樣,一個(gè)非遠(yuǎn)程java對(duì)象包含一個(gè)遠(yuǎn)程對(duì)象的stub(就好像,實(shí)例變量)。那樣,客戶端直接對(duì)服務(wù)進(jìn)行本地調(diào)用,但是服務(wù)本身可能會(huì)將其跳轉(zhuǎn),讓遠(yuǎn)程調(diào)用到其他地方?!爸悄艽怼笨梢酝ㄟ^(guò)在客戶端做某些工作提高在客戶端和服務(wù)上的表現(xiàn)。

進(jìn)入討論組討論。
Jini架構(gòu)

Jini和其他所有分布式技術(shù)(普通的RMI,EJB和Web services)有另外一個(gè)主要不同點(diǎn)是Jini利用分布式租約幫助建立自愈網(wǎng)絡(luò)。如果Jini服務(wù)是遠(yuǎn)程的,例如,他給客戶端一個(gè)租約并說(shuō):“這是你的租約。如果你不更新它,我將假設(shè)你已經(jīng)離開(kāi),我將停止你在這里代表的任何資源?!弊钚碌木W(wǎng)絡(luò)如何保持依賴于這些租約的時(shí)長(zhǎng)。例如,一個(gè)兩小時(shí)的租約將意味著客戶端可能斷開(kāi)將近兩個(gè)小時(shí),而你(服務(wù))卻不知道。多么浪費(fèi)!另一方面,一個(gè)一秒鐘的租約意味著最近的網(wǎng)絡(luò),但是所有人花費(fèi)其所有的周期和帶寬去更新租約!所以那是筆交易,這依賴于服務(wù)的類型以及其他服務(wù)質(zhì)量問(wèn)題。

自愈型網(wǎng)絡(luò)另一個(gè)很酷的東西是:既然Jini查找服務(wù)是一個(gè)Jini服務(wù),查找服務(wù)給Jini服務(wù)一個(gè)租約。所以在這種情況下,Jini服務(wù)對(duì)于Jini查找服務(wù)是個(gè)客戶。那樣,當(dāng)一個(gè)普通客戶端(或者說(shuō),一個(gè)本身不是Jini服務(wù)的客戶端,而是想用Jini服務(wù)的程序)來(lái)查找一個(gè)服務(wù),比如打印機(jī),如果服務(wù)沒(méi)有通過(guò)查找服務(wù)更新客戶端將不視其為“可用”。此外,租約時(shí)間越短,就越是最近的網(wǎng)絡(luò)的寫照,越不可能會(huì)令到一個(gè)客戶選擇一個(gè)不再可用的服務(wù)。

如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖十四)
如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖十五)

Jini暴露

如果你是一個(gè)客戶端,你想從Jini服務(wù)中取得某些東西,你必須有對(duì)于這個(gè)服務(wù)的接口。不想RMI,Jini具有更靈活性,因?yàn)槟愠私涌谕獠恍枰榔渌麞|西。你并不需要知道注冊(cè)的名字或者Service的位置。只要你知道接口以及你在一個(gè)可以發(fā)現(xiàn)查找服務(wù)的網(wǎng)絡(luò),你就可以工作了。

今天,幸運(yùn)的是開(kāi)發(fā)者給你接口。但是有少量的接口到處漂浮,變成某種標(biāo)準(zhǔn),包括Bill Venner的名聲不好的ServiceUI.

發(fā)現(xiàn)服務(wù)類

不像RMI,在Jini中你將不可以選擇是否使用動(dòng)態(tài)代碼下載。你幾乎被迫使用它。(你也可以不使用它,但是這違背了Jini的本來(lái)目的。)通過(guò)Jini,你不需要知道網(wǎng)絡(luò)中內(nèi)容的位置,你也不需要知道誰(shuí)建立這個(gè)服務(wù)。記著,所有你要的只是接口,而且在很多情況下,你需要擔(dān)心的你需要去實(shí)現(xiàn)服務(wù)的接口(也許是個(gè)stub,也許是真正的服務(wù),或者集合體…)。

記著,在RMI中,你在客戶端中需要的類通常是Stub類,而不是服務(wù)本身。在Jini中,如果服務(wù)被實(shí)現(xiàn)為遠(yuǎn)程對(duì)象,或者是真實(shí)的服務(wù),你調(diào)用方法的應(yīng)該在stub中---例如,一個(gè)實(shí)現(xiàn)了接口并真正工作的類就在客戶端本地。

進(jìn)入討論組討論。
查找服務(wù)

通過(guò)Jini,你使用Jini 查找服務(wù)(lookup service),而不是RMI Registry。Jini查找服務(wù)更靈活和強(qiáng)大,而且它可以像服務(wù)對(duì)象那樣提供信息給你,哪個(gè),是或者不是遠(yuǎn)程對(duì)象stub,這依賴于服務(wù)是否是個(gè)服務(wù)器上的遠(yuǎn)程對(duì)象或者是轉(zhuǎn)載在客戶端上的非遠(yuǎn)程對(duì)象。最好的東西是你不需要知道查找服務(wù)在哪!在RMI中,你必須知道遠(yuǎn)程服務(wù)的IP地址和端口號(hào)來(lái)找到服務(wù)stub所在的RMI Registry。而在Jini中,你僅知道大概在某處,在那兒的網(wǎng)絡(luò)上有不少于一個(gè)的查找服務(wù),通過(guò)IP廣播達(dá)到。

這就是Jini。但是Jini是個(gè)瘋狂的邊緣,這里沒(méi)有人知道任何東西,而你就在你自己的模型上,J2EE正好是相反的東西。

如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖十六)


J2EE的主要思想就是服務(wù)器(通過(guò)容器)給你一堆額外的服務(wù),否則這些服務(wù)你也許要自己寫,或者將不同的部分拼湊起來(lái),或者從私人廠商那購(gòu)買。我們現(xiàn)在談?wù)摰氖蔷扌偷姆?wù),像事務(wù)管理,并行管理,安全,資源/生命周期管理,查找服務(wù),持久化,信息服務(wù)等等。

那樣,你開(kāi)始專注于你的自己的商業(yè)規(guī)則,而不是重新去做那些繁瑣的重復(fù)的事情。其他應(yīng)用服務(wù)器已經(jīng)存在了一段時(shí)間了---如CICS和TUXEDO都是經(jīng)典的例子。但是在那種環(huán)境下你必須學(xué)私有的API,你被廠商鎖住了。J2EE是企業(yè)級(jí)商業(yè)中間層的標(biāo)準(zhǔn),所以你僅僅需要學(xué)一個(gè)API,無(wú)需考慮你要選擇的服務(wù)器。其中最好的就是你可以部署你的應(yīng)用到任何符合J2EE標(biāo)準(zhǔn)的服務(wù)器,所以你可以對(duì)廠商的枷鎖說(shuō)拜拜了。

當(dāng)然,事實(shí)上由于各種原因,將J2EE程序部署在不同的服務(wù)器上并不容易。但是你可以。而且如果你有足夠的錢換掉你現(xiàn)在的提供商,知道這個(gè)不更好?更好的是,讓廠商知道你可以這樣做。

首先,澄清一下J2EE和EJB的不同:J2EE是一個(gè)為可運(yùn)行EJB的服務(wù)器設(shè)立的規(guī)范。但是J2EE服務(wù)器同樣要支持servlets和jsp。你可以認(rèn)為J2EE就像一個(gè)整合的服務(wù)器—將servlet和支持JSP的Web服務(wù)器以及EJB服務(wù)器整合在一起的服務(wù)器。在J2EE領(lǐng)域,我們叫它子服務(wù)容器。所以我們?cè)贘2EE服務(wù)器中擁有Web容器和EJB容器。因?yàn)閎eans比servlets和JSP更吸引人,我們?cè)谶@里專注于EJB方面。同時(shí)在EJB的世界,服務(wù)就是bean。

EJB有樣很酷的東西就是基于組件的開(kāi)發(fā)模型。你建立可重用組件,這些組件是可以在部署時(shí)定制而不需要改動(dòng)java代碼。組件比java類更易用,所以他是下一個(gè)層次的重用。你利用XML文件來(lái)部署你的組件(例如beans),而這些文件說(shuō)明服務(wù)器應(yīng)該如何處理bean,所以你可以配置安全,事務(wù),資源使用等等,都聲明在XML文件中,你只需要在開(kāi)發(fā)工具中按幾個(gè)按鈕即可。(如果你真的想,你當(dāng)然可以直接編寫XML文件。但是現(xiàn)在的工具十分好,而你并不需要去做那些工作。)

進(jìn)入討論組討論。
J2EE架構(gòu)

J2EE和普通RMI一個(gè)很大不同之處就是服務(wù)器必須介入客戶的調(diào)用和服務(wù)(例如bean)的被調(diào)用中。如果客戶端遠(yuǎn)程調(diào)用已開(kāi)放的bean方法,服務(wù)器會(huì)介入并讓其隱蔽的過(guò)多的bean與客戶端直接聯(lián)系。例如,假如客戶端扮演特定的顧客調(diào)用bean中的getAddress()方法。首先,服務(wù)器必須驗(yàn)證客戶端是否經(jīng)授權(quán)去調(diào)用這個(gè)方法,但是假設(shè)客戶通過(guò)了安全檢查,現(xiàn)在服務(wù)器必須去做其他東西讓bean準(zhǔn)備好去接受調(diào)用。如果bean返回客戶的地址,比方bean會(huì)重新去數(shù)據(jù)庫(kù)記錄中取得客戶的資料。這需要變成事務(wù)的一部分,而其他客戶也許準(zhǔn)備好使用這個(gè)客戶,還有….

J2EE的解決方案是讓bean成為非遠(yuǎn)程對(duì)象,被遠(yuǎn)程對(duì)象保護(hù)。所以即使bean真的是服務(wù)(或者說(shuō),這里含有客戶想調(diào)用的商業(yè)邏輯服務(wù)方法),而bean在RMI方式中并非是遠(yuǎn)程的。但是客戶依然和RMI副本以及遠(yuǎn)程對(duì)象相互作用;就像和EJB相互作用那樣,遠(yuǎn)程對(duì)象更像是bean的保鏢。遠(yuǎn)程對(duì)象(在J2EE中叫做EJB對(duì)象)接受客戶端遠(yuǎn)程調(diào)用(例如,客戶端在stub上的調(diào)用),并同時(shí)讓服務(wù)器加入來(lái)決定如何,何時(shí)和調(diào)用是否到達(dá)bean。

如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖十七)
點(diǎn)擊查看大圖


J2EE暴露

通過(guò)EJB,在RMI規(guī)劃圖(除了服務(wù)外)中加入另一層。EJBObject是遠(yuǎn)程對(duì)象,但不像RMI中,EJBObject并不是個(gè)服務(wù)。所以那樣現(xiàn)在這里對(duì)于服務(wù)有兩個(gè)幫手,而不像普通的RMI那樣子有一個(gè)(stub)。你的服務(wù)接口依然是遠(yuǎn)程接口,而不是直接實(shí)現(xiàn)java.rmi.Remote,你的服務(wù)接口實(shí)現(xiàn)EJBObject---一個(gè)本身擴(kuò)展自java.rmi.Remote的接口。盡管bean不含有相同的方法,注意bean如何不擴(kuò)展服務(wù)接口(Advice)。(不要過(guò)于拘謹(jǐn)擔(dān)心,絕大多數(shù)注重EJB的開(kāi)發(fā)工具確認(rèn)bean和服務(wù)接口會(huì)匹配。)

如何在雞尾酒會(huì)上談?wù)揓ini,J2EE和Web服務(wù)(圖十八)

找尋服務(wù)接口

通過(guò)J2EE,你通常與客戶端開(kāi)發(fā)者同在一個(gè)企業(yè)工作,則你可發(fā)Email給他接口,或者你可以在內(nèi)部的知識(shí)庫(kù)中公布。無(wú)論如何,重要的是,就像RMI和Jini,客戶端必須在編譯時(shí)有此接口。

同樣,對(duì)stub類 ,你可以選擇提前給客戶端或者用動(dòng)態(tài)代碼下載。但是這種情況下動(dòng)態(tài)代碼下載依賴于你特定的J2EE服務(wù)器,也許不可行,所以你也許會(huì)被困于自行將stub類傳遞給客戶端的情況。大多數(shù)J2EE服務(wù)器為你部署bean準(zhǔn)備了小而精的客戶JAR。

找到服務(wù)
警告:我們?cè)谶@節(jié)擴(kuò)展了雞尾酒會(huì)知識(shí)的限制,所以這段人們就會(huì)說(shuō):”哇噢,在你寫到這之前我都跟得上你。。。”這不是我的錯(cuò),是我們的。所以這里如果你想掠過(guò),你可以直接跳入Web服務(wù),別人也不會(huì)知&

進(jìn)入討論組討論。

(出處:http://m.survivalescaperooms.com)



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 紫云| 当阳市| 江源县| 岑巩县| 荆门市| 汽车| 汉沽区| 连江县| 乾安县| 太保市| 青神县| 罗山县| 高邮市| 吴忠市| 贵定县| 茶陵县| 屯留县| 会东县| 顺平县| 杭州市| 东乌珠穆沁旗| 灵川县| 岳池县| 太仆寺旗| 喜德县| 巴南区| 甘谷县| 道真| 中西区| 明溪县| 宁海县| 沧州市| 城步| 开阳县| 孟州市| 四平市| 婺源县| 颍上县| 凤翔县| 根河市| 宁化县|