概述
Java Remote Method Invocation ( RMI -- Java遠(yuǎn)程方法調(diào)用)允許您使用Java編寫分布式對(duì)象。本文將介紹RMI的優(yōu)點(diǎn)以及如何將其連接到現(xiàn)有的和原有的系統(tǒng)中,以及與用Java 編寫的組件的連接。
RMI為采用Java對(duì)象的分布式計(jì)算提供了簡(jiǎn)單而直接的途徑。這些對(duì)象可以是新的Java對(duì)象,也可以是圍繞現(xiàn)有API的簡(jiǎn)單的Java包裝程序。Java體現(xiàn)了“編寫一次就能在任何地方運(yùn)行的模式。而RMI可將Java模式進(jìn)行擴(kuò)展,使之可在任何地方運(yùn)行”。
因?yàn)镽MI是以Java為核心的,所以,它將Java的安全性和可移植性等強(qiáng)大功能帶給了分布式計(jì)算。您可將代理和梢務(wù)邏輯等屬性移動(dòng)到網(wǎng)絡(luò)中最合適的地方。如果您要擴(kuò)展Java在系統(tǒng)中的使用,RMI將使您充分利用其強(qiáng)大功能。
RMI可利用標(biāo)準(zhǔn)Java本機(jī)方法接口JNI與現(xiàn)有的和原有的系統(tǒng)相連接。RMI還可利用標(biāo)準(zhǔn)JDBC包與現(xiàn)有的關(guān)系數(shù)據(jù)庫連接。RMI/JNI和RMI/JDBC相結(jié)合,可幫助您利用RMI與目前使用非Java語言的現(xiàn)有服務(wù)器進(jìn)行通信,而且在您需要時(shí)可擴(kuò)展Java在這些服務(wù)器上的使用。RMI可幫助您在擴(kuò)展使用時(shí)充分利用Java的強(qiáng)大功能。
優(yōu)點(diǎn)
從最基本的角度看,RMI是Java的遠(yuǎn)程過程調(diào)用(RPC)機(jī)制。與傳統(tǒng)的RPC系統(tǒng)相比,RMI具有若干優(yōu)點(diǎn),因?yàn)樗荍ava面向?qū)ο蠓椒ǖ囊徊糠?。傳統(tǒng)的RPC系統(tǒng)采用中性語言,所以是最普通的系統(tǒng)--它們不能提供所有可能的目標(biāo)平臺(tái)所具有的功能。
RMI以Java為核心,可與采用本機(jī)方法與現(xiàn)有系統(tǒng)相連接。這就是說,RMI可采用自然、直接和功能全面的方式為您提供分布式計(jì)算技術(shù),而這種技術(shù)可幫助您以不斷遞增和無縫的方式為整個(gè)系統(tǒng)添加Java功能。
RMI的主要優(yōu)點(diǎn)如下:
面向?qū)ο螅篟MI可將完整的對(duì)象作為參數(shù)和返回值進(jìn)行傳遞,而不僅僅是預(yù)定義的數(shù)據(jù)類型。也就是說,您可以將類似Java哈希表這樣的復(fù)雜類型作為一個(gè)參數(shù)進(jìn)行傳遞。而在目前的RPC系統(tǒng)中,您只能依靠客戶機(jī)將此類對(duì)象分解成基本數(shù)據(jù)類型,然后傳遞這些數(shù)據(jù)類型,最后在服務(wù)器端重新創(chuàng)建哈希表。RMI則不需額外的客戶程序代碼(將對(duì)象分解成基本數(shù)據(jù)類型),直接跨網(wǎng)傳遞對(duì)象。
可移動(dòng)屬性:RMI可將屬性(類實(shí)現(xiàn)程序)從客戶機(jī)移動(dòng)到服務(wù)器,或者從服務(wù)器移到客戶機(jī)。例如,您可以定義一個(gè)檢查雇員開支報(bào)告的接口,以便察看雇員是否遵守了公司目前實(shí)行的政策。在開支報(bào)告創(chuàng)建后,客戶機(jī)就會(huì)從服務(wù)器端獲得實(shí)現(xiàn)該接口的對(duì)象。如果政策發(fā)生變化,服務(wù)器端就會(huì)開始返回使用了新政策的該接口的另一個(gè)實(shí)現(xiàn)程序。您不必在用戶系統(tǒng)上安裝任何新的軟件就能在客戶端檢查限制條件--從而向用戶提供爍快的反饋,并降低服務(wù)器的工作量。這樣就能具備的靈活性,因?yàn)檎吒淖儠r(shí)只需要您編寫一個(gè)新的Java類,并將其在服務(wù)器主機(jī)上安裝一次即可。
設(shè)計(jì)方式:對(duì)象傳遞功能使您可以在分布式計(jì)算中充分利用面向?qū)ο蠹夹g(shù)的強(qiáng)大功能,如二層和三層結(jié)構(gòu)系統(tǒng)。如果您能夠傳遞屬性,那么您就可以在您的解決方案中使用面向?qū)ο蟮脑O(shè)計(jì)方式。所有面向?qū)ο蟮脑O(shè)計(jì)方式無不依靠不同的屬性來發(fā)揮功能,如果不能傳遞完整的對(duì)象--包括實(shí)現(xiàn)和類型--就會(huì)失去設(shè)計(jì)方式上所提供的優(yōu)點(diǎn)。
安全:RMI使用Java內(nèi)置的安全機(jī)制保證下載執(zhí)行程序時(shí)用戶系統(tǒng)的安全。RMI使用專門為保護(hù)系統(tǒng)免遭惡意小應(yīng)用程序侵害而設(shè)計(jì)的安全管理程序,可保護(hù)您的系統(tǒng)和網(wǎng)絡(luò)免遭潛在的惡意下載程序的破壞。在情況嚴(yán)重時(shí),服務(wù)器可拒絕下載任何執(zhí)行程序。
便于編寫和使用:RMI使得Java遠(yuǎn)程服務(wù)程序和訪問這些服務(wù)程序的Java客戶程序的編寫工作變得輕松、簡(jiǎn)單。遠(yuǎn)程接口實(shí)際上就是Java接口。服務(wù)程序大約用三行指令宣布本身是服務(wù)程序,其它方面則與任何其它Java對(duì)象類似。這種簡(jiǎn)單方法便于快速編寫完整的分布式對(duì)象系統(tǒng)的服務(wù)程序,并快速地制做軟件的原型和早期版本,以便于進(jìn)行測(cè)試和評(píng)估。因?yàn)镽MI程序編寫簡(jiǎn)單,所以維護(hù)也簡(jiǎn)單。
可連接現(xiàn)有/原有的系統(tǒng):RMI可通過Java的本機(jī)方法接口JNI與現(xiàn)有系統(tǒng)進(jìn)行進(jìn)行交互。利用RMI和JNI,您就能用Java語言編寫客戶端程序,還能使用現(xiàn)有的服務(wù)器端程序。在使用RMI/JNI與現(xiàn)有服務(wù)器連接時(shí),您可以有選擇地用Java重新編寫服務(wù)程序的任何部分,并使新的程序充分發(fā)揮Java的功能。類似地,RMI可利用JDBC、在不修改使用數(shù)據(jù)庫的現(xiàn)有非Java源代碼的前提下與現(xiàn)有關(guān)系數(shù)據(jù)庫進(jìn)行交互。
編寫一次,到處運(yùn)行:RMI是Java“編寫一次,到處運(yùn)行 ”方法的一部分。任何基于RMI的系統(tǒng)均可100%地移植到任何Java虛擬機(jī)上,RMI/JDBC系統(tǒng)也不例外。如果使用RMI/JNI與現(xiàn)有系統(tǒng)進(jìn)行交互工作,則采用JNI編寫的代碼可與任何Java虛擬機(jī)進(jìn)行編譯、運(yùn)行。
分布式垃圾收集:RMI采用其分布式垃圾收集功能收集不再被網(wǎng)絡(luò)中任何客戶程序所引用的遠(yuǎn)程服務(wù)對(duì)象。與Java 虛擬機(jī)內(nèi)部的垃圾收集類似,分布式垃圾收集功能允許用戶根據(jù)自己的需要定義服務(wù)器對(duì)象,并且明確這些對(duì)象在不再被客戶機(jī)引用時(shí)會(huì)被刪除。
并行計(jì)算:RMI采用多線程處理方法,可使您的服務(wù)器利用這些Java線程更好地并行處理客戶端的請(qǐng)求。Java分布式計(jì)算解決方案:RMI從JDK 1.1開始就是Java平臺(tái)的核心部分,因此,它存在于任何一臺(tái)1.1 Java虛擬機(jī)中。所有RMI系統(tǒng)均采用相同的公開協(xié)議,所以,所有Java 系統(tǒng)均可直接相互對(duì)話,而不必事先對(duì)協(xié)議進(jìn)行轉(zhuǎn)換。
傳遞屬性
前面我們講到,RMI可以傳遞屬性,并簡(jiǎn)單介紹了一下一個(gè)有關(guān)開支報(bào)告程序的情況。下面我們將深入討論如何設(shè)計(jì)這樣的系統(tǒng)。這樣介紹的目的是使您能夠利用RMI的功能將屬性從一個(gè)系統(tǒng)傳遞到另一個(gè)系統(tǒng),并隨心所欲地安排當(dāng)前的計(jì)算地點(diǎn),并便于將來的改變。下面的例子并未涉及真實(shí)世界可能發(fā)生的所有問題,但可幫助讀者了解處理問題的方法。
Java Remote Method Invocation ( RMI -- Java遠(yuǎn)程方法調(diào)用)允許您使用Java編寫分布式對(duì)象。本文將介紹RMI的優(yōu)點(diǎn)以及如何將其連接到現(xiàn)有的和原有的系統(tǒng)中,以及與用Java 編寫的組件的連接。
RMI為采用Java對(duì)象的分布式計(jì)算提供了簡(jiǎn)單而直接的途徑。這些對(duì)象可以是新的Java對(duì)象,也可以是圍繞現(xiàn)有API的簡(jiǎn)單的Java包裝程序。Java體現(xiàn)了“編寫一次就能在任何地方運(yùn)行的模式。而RMI可將Java模式進(jìn)行擴(kuò)展,使之可在任何地方運(yùn)行”。
因?yàn)镽MI是以Java為核心的,所以,它將Java的安全性和可移植性等強(qiáng)大功能帶給了分布式計(jì)算。您可將代理和梢務(wù)邏輯等屬性移動(dòng)到網(wǎng)絡(luò)中最合適的地方。如果您要擴(kuò)展Java在系統(tǒng)中的使用,RMI將使您充分利用其強(qiáng)大功能。
RMI可利用標(biāo)準(zhǔn)Java本機(jī)方法接口JNI與現(xiàn)有的和原有的系統(tǒng)相連接。RMI還可利用標(biāo)準(zhǔn)JDBC包與現(xiàn)有的關(guān)系數(shù)據(jù)庫連接。RMI/JNI和RMI/JDBC相結(jié)合,可幫助您利用RMI與目前使用非Java語言的現(xiàn)有服務(wù)器進(jìn)行通信,而且在您需要時(shí)可擴(kuò)展Java在這些服務(wù)器上的使用。RMI可幫助您在擴(kuò)展使用時(shí)充分利用Java的強(qiáng)大功能。
優(yōu)點(diǎn)
從最基本的角度看,RMI是Java的遠(yuǎn)程過程調(diào)用(RPC)機(jī)制。與傳統(tǒng)的RPC系統(tǒng)相比,RMI具有若干優(yōu)點(diǎn),因?yàn)樗荍ava面向?qū)ο蠓椒ǖ囊徊糠?。傳統(tǒng)的RPC系統(tǒng)采用中性語言,所以是最普通的系統(tǒng)--它們不能提供所有可能的目標(biāo)平臺(tái)所具有的功能。
RMI以Java為核心,可與采用本機(jī)方法與現(xiàn)有系統(tǒng)相連接。這就是說,RMI可采用自然、直接和功能全面的方式為您提供分布式計(jì)算技術(shù),而這種技術(shù)可幫助您以不斷遞增和無縫的方式為整個(gè)系統(tǒng)添加Java功能。
RMI的主要優(yōu)點(diǎn)如下:
面向?qū)ο螅篟MI可將完整的對(duì)象作為參數(shù)和返回值進(jìn)行傳遞,而不僅僅是預(yù)定義的數(shù)據(jù)類型。也就是說,您可以將類似Java哈希表這樣的復(fù)雜類型作為一個(gè)參數(shù)進(jìn)行傳遞。而在目前的RPC系統(tǒng)中,您只能依靠客戶機(jī)將此類對(duì)象分解成基本數(shù)據(jù)類型,然后傳遞這些數(shù)據(jù)類型,最后在服務(wù)器端重新創(chuàng)建哈希表。RMI則不需額外的客戶程序代碼(將對(duì)象分解成基本數(shù)據(jù)類型),直接跨網(wǎng)傳遞對(duì)象。
可移動(dòng)屬性:RMI可將屬性(類實(shí)現(xiàn)程序)從客戶機(jī)移動(dòng)到服務(wù)器,或者從服務(wù)器移到客戶機(jī)。例如,您可以定義一個(gè)檢查雇員開支報(bào)告的接口,以便察看雇員是否遵守了公司目前實(shí)行的政策。在開支報(bào)告創(chuàng)建后,客戶機(jī)就會(huì)從服務(wù)器端獲得實(shí)現(xiàn)該接口的對(duì)象。如果政策發(fā)生變化,服務(wù)器端就會(huì)開始返回使用了新政策的該接口的另一個(gè)實(shí)現(xiàn)程序。您不必在用戶系統(tǒng)上安裝任何新的軟件就能在客戶端檢查限制條件--從而向用戶提供爍快的反饋,并降低服務(wù)器的工作量。這樣就能具備的靈活性,因?yàn)檎吒淖儠r(shí)只需要您編寫一個(gè)新的Java類,并將其在服務(wù)器主機(jī)上安裝一次即可。
設(shè)計(jì)方式:對(duì)象傳遞功能使您可以在分布式計(jì)算中充分利用面向?qū)ο蠹夹g(shù)的強(qiáng)大功能,如二層和三層結(jié)構(gòu)系統(tǒng)。如果您能夠傳遞屬性,那么您就可以在您的解決方案中使用面向?qū)ο蟮脑O(shè)計(jì)方式。所有面向?qū)ο蟮脑O(shè)計(jì)方式無不依靠不同的屬性來發(fā)揮功能,如果不能傳遞完整的對(duì)象--包括實(shí)現(xiàn)和類型--就會(huì)失去設(shè)計(jì)方式上所提供的優(yōu)點(diǎn)。
安全:RMI使用Java內(nèi)置的安全機(jī)制保證下載執(zhí)行程序時(shí)用戶系統(tǒng)的安全。RMI使用專門為保護(hù)系統(tǒng)免遭惡意小應(yīng)用程序侵害而設(shè)計(jì)的安全管理程序,可保護(hù)您的系統(tǒng)和網(wǎng)絡(luò)免遭潛在的惡意下載程序的破壞。在情況嚴(yán)重時(shí),服務(wù)器可拒絕下載任何執(zhí)行程序。
便于編寫和使用:RMI使得Java遠(yuǎn)程服務(wù)程序和訪問這些服務(wù)程序的Java客戶程序的編寫工作變得輕松、簡(jiǎn)單。遠(yuǎn)程接口實(shí)際上就是Java接口。服務(wù)程序大約用三行指令宣布本身是服務(wù)程序,其它方面則與任何其它Java對(duì)象類似。這種簡(jiǎn)單方法便于快速編寫完整的分布式對(duì)象系統(tǒng)的服務(wù)程序,并快速地制做軟件的原型和早期版本,以便于進(jìn)行測(cè)試和評(píng)估。因?yàn)镽MI程序編寫簡(jiǎn)單,所以維護(hù)也簡(jiǎn)單。
可連接現(xiàn)有/原有的系統(tǒng):RMI可通過Java的本機(jī)方法接口JNI與現(xiàn)有系統(tǒng)進(jìn)行進(jìn)行交互。利用RMI和JNI,您就能用Java語言編寫客戶端程序,還能使用現(xiàn)有的服務(wù)器端程序。在使用RMI/JNI與現(xiàn)有服務(wù)器連接時(shí),您可以有選擇地用Java重新編寫服務(wù)程序的任何部分,并使新的程序充分發(fā)揮Java的功能。類似地,RMI可利用JDBC、在不修改使用數(shù)據(jù)庫的現(xiàn)有非Java源代碼的前提下與現(xiàn)有關(guān)系數(shù)據(jù)庫進(jìn)行交互。
編寫一次,到處運(yùn)行:RMI是Java“編寫一次,到處運(yùn)行 ”方法的一部分。任何基于RMI的系統(tǒng)均可100%地移植到任何Java虛擬機(jī)上,RMI/JDBC系統(tǒng)也不例外。如果使用RMI/JNI與現(xiàn)有系統(tǒng)進(jìn)行交互工作,則采用JNI編寫的代碼可與任何Java虛擬機(jī)進(jìn)行編譯、運(yùn)行。
分布式垃圾收集:RMI采用其分布式垃圾收集功能收集不再被網(wǎng)絡(luò)中任何客戶程序所引用的遠(yuǎn)程服務(wù)對(duì)象。與Java 虛擬機(jī)內(nèi)部的垃圾收集類似,分布式垃圾收集功能允許用戶根據(jù)自己的需要定義服務(wù)器對(duì)象,并且明確這些對(duì)象在不再被客戶機(jī)引用時(shí)會(huì)被刪除。
并行計(jì)算:RMI采用多線程處理方法,可使您的服務(wù)器利用這些Java線程更好地并行處理客戶端的請(qǐng)求。Java分布式計(jì)算解決方案:RMI從JDK 1.1開始就是Java平臺(tái)的核心部分,因此,它存在于任何一臺(tái)1.1 Java虛擬機(jī)中。所有RMI系統(tǒng)均采用相同的公開協(xié)議,所以,所有Java 系統(tǒng)均可直接相互對(duì)話,而不必事先對(duì)協(xié)議進(jìn)行轉(zhuǎn)換。
傳遞屬性
前面我們講到,RMI可以傳遞屬性,并簡(jiǎn)單介紹了一下一個(gè)有關(guān)開支報(bào)告程序的情況。下面我們將深入討論如何設(shè)計(jì)這樣的系統(tǒng)。這樣介紹的目的是使您能夠利用RMI的功能將屬性從一個(gè)系統(tǒng)傳遞到另一個(gè)系統(tǒng),并隨心所欲地安排當(dāng)前的計(jì)算地點(diǎn),并便于將來的改變。下面的例子并未涉及真實(shí)世界可能發(fā)生的所有問題,但可幫助讀者了解處理問題的方法。