我知道之前已经问过这样的问题。但我的问题却没有什么不同。 我有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)
答案 0 :(得分:0)
此异常意味着远程存根是“陈旧的”,即指的是不再从存根来自的JVM导出的对象。当你得到这个例外时,你必须通过你在第一时间获得它的方式重新获得存根:
lookup()
重做查找。。我有机制,每当B重新启动我清除缓存并在A中执行B的新查找
显然,该机制无效或未被调用。
注意:您应始终将LocateRegistry.createRegistry()
的结果存储在静态变量中,以防止垃圾回收。