RMI で手を汚しているときに、java.rmi.NoSuchObjectException
例外が発生したため、次の質問に至りました: java.rmi.NoSuchObjectException: no such object in table but my question is different .
メインメソッドで、つまりメインスレッドで impl オブジェクトを作成しています。私がこれを行う場合:
FooImpl fi = new FooImpl();
foo = (Foo) UnicastRemoteObject.exportObject(fi, 0);
物事はうまくいきます。
私がこれを行う場合:
foo = (Foo) UnicastRemoteObject.exportObject(new FooImpl(), 0);
FooImpl インスタンスが収集されていることがわかり、前述の例外が発生します。
foo
メインで初期化している静的参照です。別のリモート オブジェクトがfoo
そのメソッドの 1 つから返されます。したがって、クライアントは最初にそのリモートオブジェクトを取得し、次にそこfoo
から取得し、次にメソッドを呼び出しますfoo
。そのとき、上記で説明したように例外が発生します。では、なぜこのようなことが起こっているのでしょうか。
編集:これが私の主な方法です
public static void main(String[] args) throws RemoteException, AlreadyBoundException
{
Server server = new Server();
Hello stub = (Hello) UnicastRemoteObject.exportObject(server, 0);
FooImpl fi = new FooImpl();
foo = (Foo) UnicastRemoteObject.exportObject(fi, 0);
Registry registry = LocateRegistry.getRegistry();
registry.bind("Hello", stub);
System.out.println("Server ready!");
}
クライアントでは、メソッドを取得hello
して呼び出すと、メソッドが呼び出されてからfoo
メソッドが呼び出されfoo
ます。
EDIT2:私が使用する場合
Hello stub = (Hello) UnicastRemoteObject.exportObject(new Server(), 0);
foo
最初にバインドhello
してから 、アクセスしようとすると同じ例外がスローhello
されます。これは、収集されているサーバーインスタンスであるためです。本当に奇妙なもの!