在远程对象上调用方法时获取java.rmi.NoSuchObjectException

时间:2014-06-25 04:20:37

标签: java rmi

我知道之前已经问过这样的问题。但我的问题却没有什么不同。 我有2个服务,A和B.A使用B通过RMI的方法。 B通过以下3个语句出口自己: -

Remote stub = UnicastRemoteObject.exportObject( rs, port,socketFactory,socketFactory);
Registry registry = LocateRegistry.createRegistry( port,socketFactory,socketFactory  );
registry.rebind( serviceBindName, stub );  

其中rs是远程对象实现。

现在A通过以下2个语句查找B: -

Registry registry = LocateRegistry.getRegistry( BsIP, BsRMIPort);
RemoteServiceRegistry rs = ( RemoteServiceRegistry ) registry.lookup( serviceBindName);

现在一切顺利。通过查找从B获取存根,并为所有后续请求缓存它。 但是当我重新启动时问题就开始了。我有机制通过这种机制,每当B重新启动我清除缓存并在A中执行新的B查找时,但它不起作用并在A和B中抛出异常。

我对此毫无头绪。请帮忙。如果您需要更多信息,请告诉我。

A

中的例外情况
java.rmi.NoSuchObjectException: no such object in table
        at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
        at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
        at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
        at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)

B中的异常(向JVM添加属性后,-Djava.rmi.server.logCalls = true)

FINE: RMI TCP Connection(10)-192.168.50.243: [192.168.50.243] exception:
java.rmi.NoSuchObjectException: no such object in table
        at sun.rmi.transport.Transport.serviceCall(Transport.java:135)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)

1 个答案:

答案 0 :(得分:0)

此异常意味着远程存根是“陈旧的”,即指的是不再从存根来自的JVM导出的对象。当你得到这个例外时,你必须通过你在第一时间获得它的方式重新获得存根:

  • 如果通过lookup()重做查找。
  • 如果通过您自己的远程方法调用,重做它,并注意反过来可能会失败并出现相同的异常,依此类推。
  

。我有机制,每当B重新启动我清除缓存并在A中执行B的新查找

显然,该机制无效或未被调用。

注意:您应始终将LocateRegistry.createRegistry()的结果存储在静态变量中,以防止垃圾回收。