繁体   English   中英

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

[英]Getting java.rmi.NoSuchObjectException while invoking a method on remote object

我知道以前曾问过这类问题。但是我的问题没什么不同。 我有2个服务,A和BA通过RMI使用B的方法。 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);

现在一切都顺利进行,A通过查找从B获取存根并将其缓存用于所有后续请求。 但是当我重新启动BI时问题就开始了,它具有一种机制,无论何时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)

此异常意味着远程存根是“陈旧的”,即,它指向不再从存根来自的JVM导出的对象。 当您收到此异常时,必须首先使用相同的方法重新获取存根:

  • 如果通过lookup() ,则重做查找。
  • 如果通过您自己的远程方法调用,请重做它,并注意这又可能因相同的异常而失败,依此类推。

。我有一种机制,每当B重新启动时,我都会通过该机制清除缓存并在A中执行B的新查找

显然,该机制不起作用或未被调用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM