RMIローカルレジストリをシャットダウンする
以下のコードでできるはずだと思ったのだが、上手くいかない
Registry registry = LocateRegistry.getRegistry("localhost", Registry.REGISTRY_PORT); UnicastRemoteObject.unexportObject(registry, true);
実行結果
java.rmi.NoSuchObjectException: object not exported at sun.rmi.transport.ObjectTable.unexportObject(ObjectTable.java:136) at java.rmi.server.UnicastRemoteObject.unexportObject(UnicastRemoteObject.java:280)
unexportObjectメソッドはスタブ(実際にはプロキシ)では駄目で、実際のリモートオブジェクトへの参照を使う必要があるということをすっかり忘れていた。
従って(何時生成したか解らない)ローカルレジストリを生成した際の参照を退避しておく必要がある。
例)
static Registry localRegistryRef; //仮にスタティックコンストラクタで生成しているとする(他のクラスでも呼ばれている可能性はある) static { localRegistryRef = LocateRegistry.createRegistry(Registry.REGISTRY_PORT); } synchronized static void shutdownLocalRegistry() { if ( localRegistryRef != null ) { UnicastRemoteObject.unexportObject(localRegistryRef , true); } }
いつものことだが、例外処理は省く。(内部では全てフレームワークのランタイム例外で捕捉している)