2013-01-24 19 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