天天看點

java.rmi.NoSuchObjectException故障排除記錄

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