0

我想在 rmi 中设置远程对象的主机地址。是否可以在存根中设置此 IP 地址?

不是:我知道我可以使用 ThreadLocalRmiClientSocket 工厂制造一个技巧,但我不想使用它。

4

2 回答 2

1

在远程存根中,您需要为受保护的 RemoteRef ref字段设置一个新值。所有远程通信都通过这个对象。由于该字段受到保护,因此您只能在从 RMI 存根派生的自己的类中简单地执行此操作。

不幸的是 RemoteRef 是一个没有公共实现的接口。您可以查看现有的OpenJDK 实现。从那里可以看出,有一个实现sun.rmi.server.UnicastRef需要 aLiveRef并且一个需要EndpointEndpoint已经是比较容易理解的类了。您可能需要在代码中复制这些类的功能。

为了确保存根类确实存在,请使用 rmic 生成它,甚至可以使用-keepgenerated这样您就可以检查该字段确实存在的源代码 - 谁知道特定实现的细节。

一般来说,这绝不是一个优雅而简单的解决方案,但它应该可以工作。

扩展:由于这一切看起来相当复杂,我建议获取一个新的有效存根,该存根指向远程服务的更新位置并从中窃取ref字段的值。这似乎相对容易做到,如果当前存根与某些数据结构纠缠在一起,因此您无法轻松替换它,这可能是合理的。存根本身并不关心主机、端口、对象 id 或 watsoever,只要远程端继续实现相同的远程合约——只有它自己关心RemoteRef。Stub 依赖于RemoteRef.invoke

于 2013-01-27T14:38:51.983 回答
-2

在导出任何远程对象之前,您需要在服务器 JVM 中适当地设置系统属性“java.rmi.server.hostname”。然后在导出时创建该值时将该值嵌入到存根中。

于 2013-01-27T22:11:58.017 回答