簡體   English   中英

RMI:將非遠程對象類傳遞給服務器

[英]RMI: pass non-remote object classes to a server

假設我有一個遠程類,該類具有帶有POJO參數的方法:

class MyRemote implements Remote {

    void service(Param param) throws RemoteException;

}

客戶端檢索存根並執行以下操作:

// DerivedParam is defined by the client
// and is derived from Param
DerivedParam dparam = getDerivedParam();
myService.service(dparam);

它失敗了,因為服務器對DerivedParam類(以及它可能實現的接口)一無所知。

問題:是否有可能將這些類從客戶端傳遞到服務器,以使這樣的調用成為可能?

我不是該主題的專家,但是前段時間我確實做到了這一點。 神奇之處在於通過設置java.rmi.server.codebase屬性來使用代碼移動性。

您使該屬性指向共享類可能駐留的URL或URL的空格分隔列表。 例如,這可能是FTP服務器或HTTP服務器,其中包含具有通用類的jar文件。

設置完成后,代碼庫批注將包含在服務器和客戶端編組的所有對象中,並且當任何一方都找不到類時,他們會在代碼庫提供的URL中進行查找並動態加載。

請閱讀使用Java RMI進行動態代碼下載

假設您僅向客戶端提供接口,並且實現將位於給定的代碼庫中。 然后客戶端請求服務器發送給定的對象,客戶端希望接收一個實現給定接口的對象,但是客戶端反序列化發送的對象是在必須轉到代碼時,客戶端才知道實際的實現並為要傳遞的實際對象下載相應的實現類。

這將使客戶端非常瘦,並且您將非常容易地更新代碼庫中的類,而不必訴諸於更新每個客戶端。

假設您有一個具有以下界面的RMI服務器

public interface MiddleEarth {
     public List<Creature> getAllCreatures();
}

客戶端僅具有MiddleEarthCreature的接口,而類路徑中沒有任何實現。

Creature的實現是ElfManDwarfHobbit類型的可序列化對象時。 這些實現位於您的代碼庫中,而不位於客戶端的類路徑中。

當您要求RMI服務器向您發送“中地球”中所有生物的列表時,它將發送實現Creature對象,即上面列出的任何類。

當客戶端收到序列化的對象時,它必須查找類文件以反序列化它們,但是這些文件不在本地類路徑中。 此流中的每個對象都帶有給定的代碼庫標記,該代碼庫可用於查找缺少的類。 因此,客戶端求助於代碼庫來查找這些類。 在那里,它將找到正在使用的實際生物類別。

代碼庫在兩個方向上均有效,因此這意味着,如果您向服務器發送Creature (即Ent ),它也會在代碼庫中尋找它。

這意味着,當兩者,客戶端和服務器需要發布新的類型的生物所有他們所要做的是更新creaturesImpl.jar代碼庫中,並沒有在服務器或客戶端應用程序本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM