前天項目測試環境出現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,問題就解決了。