[英]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.