2013-01-24 20 views
0



我正在開發兩個通過RMI連接的應用程序。溝通是雙向的,一切正常,直到我在Windows上運行。當我將jar文件發送到Debian時,連接失敗,出現java.rmi.NoSuchObjectException

任何想法有什麼區別的Linux或爲什麼不工作?Linux上的java.rmi.NoSuchObjectException

編輯:我的代碼:
服務器端:

static Registrator clientRegistrator = null; // static field, interface extending java.rmi.Remote 
... 
Registry rmiRegistry = LocateRegistry.createRegistry(RmiConstants.RMI_REGISTRY_PORT); 
clientRegistrator = (Registrator) UnicastRemoteObject.exportObject(new RmiClientRegistrator(networkListeners), RmiConstants.RMI_REGISTRY_PORT); // RmiClientRegistrator implements Registrator interface 
rmiRegistry.bind(RmiConstants.RMI_SERVER_MARK, clientRegistrator); 


客戶端:

static Registrator serverRegistrator = null; 
String rmiConnectionString = "rmi://localhost:" + RmiConstants.RMI_REGISTRY_PORT + "/" + RmiConstants.RMI_SERVER_MARK; 
serverRegistrator = (Registrator) Naming.lookup(rmiConnectionString); 
serverRegistrator.registerClient(dataReceiver); // fails here, with mentioned exception 

回答

2

的unexportObject方法的遠程對象稱爲拋出由您的存根(stub)不再存在。更準確地說,它不再被導出。在客戶端仍然存在活動存根時,不應發生這種情況,除非您自己未將其導出,或者除非網絡分區導致DGC故障。

對此的最可靠補救措施是在從中導出的JVM中保留對遠程對象的靜態引用。

+0

引用存在,我啓動一個應用程序,即時第二個應用程序,都在本地主機上。我可能會嘗試使參考靜態,但恐怕,不存在的參考不是問題 – Kousalik

+0

現在我正在尋找,它一直是靜態參考。查找找到引用,但是當我立即調用一個方法時,它失敗。 – Kousalik

+0

@Kousalik它是由new()創建的對遠程對象的引用,還是由exportObject()返回的對stub的引用?你是否在使用單獨的註冊表或進程內註冊表?如果後者,你是否持有一個靜態的參考?由LocateRegistry()返回。createRegistry()? – EJP

-1

你在這裏看到:

java.rmi.NoSuchObjectException: no such object in table

Java RMI NoSuchObjectException

here

NoSuchObjectException如果試圖以調用在遠程虛擬機上已不存在的對象的方法被拋出。如果發生NoSuchObjectException嘗試調用遠程對象上的方法,則可能會重新傳輸該調用,並仍然保留RMI的「至多一次」調用語義。甲NoSuchObjectException也通過該方法java.rmi.server.RemoteObject.toStub和通過java.rmi.server.UnicastRemoteObject和java.rmi.activation.Activatable中和

+0

是的,我做了,但我沒看到,它是如何相關的。我的應用在Windows上運行良好。問題是在Linux上運行時。兩者都運行Oracle JVM – Kousalik