リモートオブジェクトを取ってきてメソッドを呼び出すときに"no such object in table"とかいいつつ例外が出る件。
interface RmiServer extends Remote{ }
などというRMIの定義があるとして
class SomeClass{ RmiServer server; void someMethod(){ RmiServer localServer = new RmiServerImpl(); server = (RmiServer)UnicastRemoteObject.exportObject(localServer, 0); Registry reg = LocateRegistry.getRegistry(java.rmi.registry.Registry.REGISTRY_PORT); reg.rebind("server", server); } }
などとRMIレジストリーに登録してると、呼び出し側がメソッドを呼びだすときにNoSuchObjectExceptionが出たり出なかったりする。
結局、exportObjectしてできたオブジェクトは、元になるサーバーオブジェクトへの参照を持っていないために、上のコードだとlocalServer変数に割り当てたサーバーオブジェクトがGCされて、いざメソッドが呼び出されたときに例外が出るという話。
悩まされました。