前天项目测试环境出现java.rmi.NoSuchObjectException: no such object in table错误,耗费了我两天时间,终于找到真实原因。
测试环境有两台Linux机器,都发布同样的RMI服务,其中一台机器的RMI服务可以正常访问,另外一台机器的RMI服务启动时没有错误,但用客户端连接时出现java.rmi.NoSuchObjectException: no such object in table错误。
首先google一下,发现很多情况下这个错误是由于hosts文件不正确导致的,修改hosts文件,无效。
其次,判断错误原因应该是服务器的网络相关配置有问题,查看相关配置文件,也没发现问题。
然后,仔细看RMI服务端启动日志,发现相关日志为:
Binding service 'aService' to RMI registry: RegistryImpl[UnicastServerRef [liveRef: [endpoint:[192.168.10.59:54321](local),objID:[0:0:0, 0]]]]
Binding service 'bService' to RMI registry: RegistryImpl_Stub[UnicastRef [liveRef: [endpoint:[192.168.10.60:54321](remote),objID:[0:0:0, 0]]]]
而这台机器的ip为192.168.10.60,不是59,这就奇怪了,为啥第二个RMI服务注册地址是正确,而第一个RMI服务注册地址就错了呢?
由于我是用Spring来配置RMI服务的,阅读Spring相关源代码试图找到原因,也未果。
其间又google了很多资料,都没解决这个问题。
刚才,我无意中看了一下启动RMI服务的脚本文件,这才感到写这个文件的人可恨,浪费我两天时间。
这个脚本文件是这样写的:
screen ant runEngine -Dhostname=192.168.10.59
将其中的192.168.10.59改为192.168.10.60,问题就解决了。
测试环境有两台Linux机器,都发布同样的RMI服务,其中一台机器的RMI服务可以正常访问,另外一台机器的RMI服务启动时没有错误,但用客户端连接时出现java.rmi.NoSuchObjectException: no such object in table错误。
首先google一下,发现很多情况下这个错误是由于hosts文件不正确导致的,修改hosts文件,无效。
其次,判断错误原因应该是服务器的网络相关配置有问题,查看相关配置文件,也没发现问题。
然后,仔细看RMI服务端启动日志,发现相关日志为:
Binding service 'aService' to RMI registry: RegistryImpl[UnicastServerRef [liveRef: [endpoint:[192.168.10.59:54321](local),objID:[0:0:0, 0]]]]
Binding service 'bService' to RMI registry: RegistryImpl_Stub[UnicastRef [liveRef: [endpoint:[192.168.10.60:54321](remote),objID:[0:0:0, 0]]]]
而这台机器的ip为192.168.10.60,不是59,这就奇怪了,为啥第二个RMI服务注册地址是正确,而第一个RMI服务注册地址就错了呢?
由于我是用Spring来配置RMI服务的,阅读Spring相关源代码试图找到原因,也未果。
其间又google了很多资料,都没解决这个问题。
刚才,我无意中看了一下启动RMI服务的脚本文件,这才感到写这个文件的人可恨,浪费我两天时间。
这个脚本文件是这样写的:
screen ant runEngine -Dhostname=192.168.10.59
将其中的192.168.10.59改为192.168.10.60,问题就解决了。