RMI-IIOP与JNDI简单小结
?Java RMI-IIOP(java remote method invocation over the internet inter-ORB protocol),如果使用過RMI,就應該很清除RMI是Java執行遠程方法調用的方式,而RMI-IIOP則是RMI的功能擴展版本,增加了如:分布式垃圾收集,對象活化,可下載類文件等,所以你可以把RMI理解成為RMI-IIOP的簡化版本,在分布式對象方法調用上他們都完成了最基本的功能。
?? J2ee中強制使用RMI-IIOP,所以你在RMI-IIOP和RMI中沒有的選擇
?? 為了便于理解,先介紹一些基本概念:
?? -RPC(遠程過程調用) 是從一個機器上的過程啟用另一個機器上的過程
?? -接口 定義對象所公開的信息
?? -實現 是由對象提供的核心邏輯程序
?? -RMI 所有網絡代碼都是應用于接口的,而不是執行代碼,換句話說,就是所有的網絡代碼都是提供給遠程過程調用的。
那么RMI-IIOP是怎樣完成遠程方法調用的呢?
?? RMI-IIOP的目的其實很明確,就是在調用遠程機器上的對象時就像調用任何其他的Java對象一樣,視網絡的存在為一種透明。RMI-IIOP是如何實現這一功能的呢?很簡單,RMI-IIOP把遠程對象的調用模擬成本地對象的調用,即所謂的根程序(stub),根程序負責接收對象方法的本地調用,由于本地通過根程序調用,所以網絡的復雜問題都被隱藏在它后面了;那么遠程對象如何處理能讓調用它的機器得到對應的實現呢?其實處理的方式和客戶機一樣,遠程對象通過一個所謂的程序框架(Skeleton)負責接收網絡傳發過來的調用。如此以來遠程調用的過程其實就發生在根程序和程序框架之間,關于他們是由RMIC(RMI編譯器)來生成,具體的實現過程我們就不用管了。根程序和程序框架的功能是處理參數,而參數由如何傳送呢?
?? 可能你曾聽說過對象序列化的概念,顧名思義,把對象變成能在網絡上傳輸的一些有序信號,這就涉及到如何變,又如何還原的問題了,即所謂的編組和解組的問題。我們首先來看看參數傳遞吧!當調用方法時,有兩種主要的傳遞參數的方法,值傳遞和引用傳遞。值傳遞是當產生調用過程時,遠程主機先實例化一個對象T的一個新拷貝T1,然后可能修改這個拷貝的值T2,此時對象T是不會發生變化的,然后把需要的對象T2從遠程傳回來;而引用是對原對象T的遠程引用,并不是對象引用的一個拷貝,所以當可能修改遠程引用為T2時,遠程對象也從T變成了T2,這個引用使用一個引用傳遞調用的協定完成,這于Java語言不同,Java中的用一個對象參數正常的調用一個方法時,拷貝的是對象的引用而不是對象的真實數據,這里一定要注意理解哦。接下來的問題又出來了,一個對象通過網絡傳遞了,但該對象引用了其他對象,并不只孤身一個,那么在目標機上怎樣處理呢?目標機的內存地址可不會和引用的機器內存地址映射啊!這就輪到對象序列化上場了,可見每一種技術的產生都是為了處理新的問題,但是人類往往是新問題處理了又會憑空增加新問題處理以后的問題,所以做人辛苦呢,可能一生都在問題中處理著,這讓我想到了莊子隨意之態,如果我們不去處理問題,問題永遠僅僅就那么點,也不會有新問題,更不會越來越復雜,不知道那個時候的世界會是什么樣子!瞎扯了,言規正轉,剛才說道對象序列化,其實很簡單,就是將一個Java對象轉化為一個描述該對象的位塊(bit-blob),對象變成位塊時就可以隨意的傳了,其實也就是把一系列Java引用打包了,怎樣序列化,我想你應該很清楚吧,就是實現java.lang.Serializable接口,做到這一步就可以了,Java會處理余下可序列化和解序列化的問題了。
?? 小結一下:當遠程調用時,所有的JAVA簡單的基本類型都是用值傳遞,即參數拷貝傳遞,不影響原始數據,要用值傳遞必須實現java.lang.Serializable接口。如果要使用引用傳遞就必須實現java.rmi.remote,該對象的根程序將被序列化傳給遠程主機,然后就可以根據根程序來請求遠程對象了,任何時候根程序所持有的數據都是同遠程主機相同的。解決了遠程調用的問題,下一部就是需要遠程調用的客戶由如何定位遠程主機呢?
轉載于:https://www.cnblogs.com/liaomin416100569/archive/2010/03/22/9331923.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的RMI-IIOP与JNDI简单小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP Memcached + APC
- 下一篇: (解题思路)Entity Framewo