我们希望从我们网络中的不同主机(dev-pc通过ssh-tunnel,通过直接连接的jenkins-server)访问同一个RMI服务器。问题在于RMI主机在不同客户端主机上以不同名称知道。RMI存根:在客户端强制主机值
这不是一个问题,当我们连接到注册表,因为我们可以将目标主机名是这样的:
Registry registry = LocateRegistry.getRegistry("hostname", 10099, new CustomSslRMIClientSocketFactory());
但是,当我们查找远程对象像下面,它包含了错误的主机名。
HelloRemote hello = (HelloRemote) registry.lookup(HelloRemote.class.getSimpleName());
在调试器中,我可以看到,就像需要注册表对象上的主机,但不能在存根:
我们尽快得到一个连接超时,我们调用方法上存根。如果我在调试器中手动将主机值更改为localhost
,则方法调用将成功。
我知道我可以在服务器端设置java.rmi.server.hostname
,但然后jenkins的连接不再工作。 最简单的解决方案是强制RMI使用与注册表相同的主机,以便从该注册表中检索到所有存根。有没有比通过反射替换存根中的主机值更好的方法?