我想在rmi中设置远程对象的主机地址。可以在存根中设置这个ip地址吗?
NOT:我知道我可以使用ThreadLocalRmiClientSocket工厂制作技巧,但我不想使用它。
答案 0 :(得分:1)
在远程存根中,您需要为protected RemoteRef ref字段设置新值。所有远程通信都通过此对象。由于该字段受到保护,您只能在您从RMI存根派生的类中执行此操作。
不幸的是,RemoteRef是一个没有公共实现的接口。您可以查看现有的OpenJDK implementation。从那里可以看出,有一个实施sun.rmi.server.UnicastRef
需要LiveRef
,而且需要Endpoint
。 Endpoint
已经相对容易理解。您可能需要在代码中复制这些类的功能。
为了确保存根类实际存在,使用rmic生成它,甚至可以使用-keepgenerated
,这样您就可以检查该字段确实存在的源代码 - 谁知道特定实现的细节。
一般来说,这绝不是一个优雅而简单的解决方案,但它应该有效。
扩展:由于所有这些看起来相当复杂,我建议改为获取一个新的有效存根,指向远程服务的更新位置并窃取{{1}的值来自它的领域。这看起来相对容易,如果当前存根在某些数据结构中纠缠不清,可能是合理的,这样您就无法轻易替换它。只要远程端继续实现相同的远程协定 - 只有其ref
,远程端本身并不关心主机,端口,对象ID或视图。 Stub依赖于RemoteRef.invoke。
答案 1 :(得分:-2)
在导出任何远程对象之前,需要在服务器JVM中相应地设置系统属性“java.rmi.server.hostname”。然后,在导出时创建该值时,该值将嵌入到存根中。