RMI:将非远程对象类传递给服务器

时间:2012-05-29 12:10:04

标签: java rmi

假设我有一个带有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类(以及它可能实现的接口)的线索。

问题:是否有可能将这些类从客户端传递到服务器以实现这样的调用?

1 个答案:

答案 0 :(得分:3)

我不是这方面的专家,但是我前段时间确实没过这个伎俩。通过设置java.rmi.server.codebase属性,可以使用code mobility

您将此属性指向您的共享类可能驻留的URL或以空格分隔的URL列表。例如,这可以是FTP服务器或HTTP服务器,其中包含公共类的jar文件。

设置完成后,代码库注释将包含在服务器和客户端编组的所有对象中,当任何一方无法找到类时,他们会在代码库中提供的URL中查找并动态加载它。 / p>

请阅读Dynamic Code Downloading with Java RMI

假设您只向客户端提供接口,并且实现将位于给定的代码库中。然后客户端请求服务器发送给定的对象,客户端期望接收实现给定接口的对象,但客户端不知道实际的实现,当它反序列化发送的对象时,它必须转到代码base并为正在传递的实际对象下载相应的实现类。

这将使客户端非常精简,您可以非常轻松地更新代码库中的类,而无需更新每个客户端。

假设您有一个具有以下接口的RMI服务器

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

客户端只有MiddleEarthCreature的接口,但没有类路径中的实现。

Creature的实现是ElfManDwarfHobbit类型的可序列化对象。这些实现位于您的代码库中,但不在客户端的类路径中。

当您要求RMI服务器向您发送中土世界中所有生物的列表时,它将发送实现Creature的对象,即上面列出的任何类。

当客户端收到序列化对象时,它必须查找类文件才能对它们进行反序列化,但这些文件不在本地类路径中。此流中的每个对象都标有给定的代码库,可用于查找缺少的类。因此,客户端借助代码库来查找这些类。在那里它将找到正在使用的实际生物类。

代码库在两个方向都有效,因此这意味着如果您向服务器发送Creature(即Ent),它也会在代码库中查找它。

这意味着当客户端和服务器都需要发布新类型的生物时,他们所要做的就是更新代码库中的creaturesImpl.jar,而不更新服务器或客户端应用程序本身。

相关问题