簡體   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