繁体   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