RMI-IIOP與JNDI簡單小結

Java RMI-IIOP(java remote method invocation over the internet inter-ORB protocol),如果使用過RMI,就應該很清除RMI是Java執行遠程方法調用的方式,而RMI-IIOP則是RMI的功能擴展版本,增加了如:[color=red]分佈式垃圾收集,對象活化,可下載類文件等[/color],所以你可以把RMI理解成爲RMI-IIOP的簡化版本,在分佈式對象方法調用上他們都完成了最基本的功能。

[color=red]J2ee中強制使用RMI-IIOP,所以你在RMI-IIOP和RMI中沒有的選擇[/color]

爲了便於理解,先介紹一些基本概念:

-RPC(遠程過程調用) 是從一個機器上的過程啓用另一個機器上的過程

-接口 定義對象所公開的信息

-實現 是由對象提供的核心邏輯程序

-RMI 所有網絡代碼都是應用於接口的,而不是執行代碼,換句話說,就是所有的網絡代碼都是提供給遠程過程調用的。

那麼RMI-IIOP是怎樣完成遠程方法調用的呢?

RMI-IIOP的目的其實很明確,就是在調用遠程機器上的對象時就像調用任何其他的Java對象一樣,視網絡的存在爲一種透明。RMI-IIOP是如何實現這一功能的呢?很簡單,RMI-IIOP把遠程對象的調用模擬成本地對象的調用,即所謂的根程序(stub),根程序負責接收對象方法的本地調用,由於本地通過根程序調用,所以網絡的複雜問題都被隱藏在它後面了;那麼遠程對象如何處理能讓調用它的機器得到對應的實現呢?其實處理的方式和客戶機一樣,遠程對象通過一個所謂的程序框架(Skeleton)負責接收網絡傳發過來的調用。如此以來遠程調用的過程其實就發生在根程序和程序框架之間,關於他們是由RMIC(RMI編譯器)來生成,具體的實現過程我們就不用管了。根程序和程序框架的功能是處理參數,而參數由如何傳送呢?

可能你曾聽說過對象序列化的概念,顧名思義,把對象變成能在網絡上傳輸的一些有序信號,這就涉及到如何變,又如何還原的問題了,即所謂的編組和解組的問題。我們首先來看看參數傳遞吧!當調用方法時,有兩種主要的傳遞參數的方法,值傳遞和引用傳遞。[color=red]值傳遞[/color]是當產生調用過程時,遠程主機先實例化一個對象T的一個新拷貝T1,然後可能修改這個拷貝的值T2,此時對象T是不會發生變化的,然後把需要的對象T2從遠程傳回來;而[color=red]引用是對原對象T的遠程引[/color]用,並不是對象引用的一個拷貝,所以當可能修改遠程引用爲T2時,遠程對象也從T變成了T2,這個引用使用一個引用傳遞調用的協定完成,這於Java語言不同,Java中的用一個對象參數正常的調用一個方法時,拷貝的是對象的引用而不是對象的真實數據,這裏一定要注意理解哦。接下來的問題又出來了,一個對象通過網絡傳遞了,但該對象引用了其他對象,並不只孤身一個,那麼在目標機上怎樣處理呢?目標機的內存地址可不會和引用的機器內存地址映射啊!這就輪到對象序列化上場了,可見每一種技術的產生都是爲了處理新的問題,但是人類往往是新問題處理了又會憑空增加新問題處理以後的問題,所以做人辛苦呢,可能一生都在問題中處理着,這讓我想到了[color=darkred]莊子隨意之態[/color],如果我們不去處理問題,問題永遠僅僅就那麼點,也不會有新問題,更不會越來越複雜,不知道那個時候的世界會是什麼樣子!瞎扯了,言規正轉,剛纔說道對象序列化,其實很簡單,就是將一個Java對象轉化爲一個描述該[color=red]對象的位塊(bit-blob),[/color]對象變成位塊時就可以隨意的傳了,其實也就是把一系列Java引用打包了,怎樣序列化,我想你應該很清楚吧,就是實現java.lang.Serializable接口,做到這一步就可以了,Java會處理餘下可序列化和解序列化的問題了。

小結一下:當遠程調用時,所有的JAVA簡單的基本類型都是用值傳遞,即參數拷貝傳遞,不影響原始數據,要用值傳遞必須實現java.lang.Serializable接口。如果要使用引用傳遞就必須實現java.rmi.remote,該對象的根程序將被序列化傳給遠程主機,然後就可以根據根程序來請求遠程對象了,任何時候根程序所持有的數據都是同遠程主機相同的。
發佈了0 篇原創文章 · 獲贊 0 · 訪問量 3062
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章