3

RMI を使用して WebAppA から WebAppB に String オブジェクトを渡します。WebAppB は RMIServer ですが、WebAppA は RMIClient です。WebAppB に ContextListener を追加したので、Tomcat でコンテキストが初期化されるとすぐに rmi サービスが開始されます。また、Tomcat の contextDestroyed メソッドで次のステートメントを使用して、rmi を終了/シャットダウンしようとしています。

unexportObject(remoteObj,true);
LocateRegistry.getRegistry(3232).unbind("MessagePath"); //MessagePath - name of the remote reference

しかし、前述のステートメントを実行した後でも、rmi はポート 3232 で着信要求をリッスンしています。コマンド プロンプトで「netsat -ano」を使用して確認しました。RMI サービスを終了するのを手伝ってください。

4

3 に答える 3

1

getRegistry はスタブのみを返すため、unexportObject で createRegistry によって返されるインスタンスを使用します。ただし、私の場合、これも役に立ちません-レジストリはもうアクティブではありませんが、ソケットはまだ開いていてリッスンしています:-(

于 2009-10-14T14:53:20.183 に答える
0

createRegistryレジストリをシャットダウンしようとしているときは機能しません。

Registry registry = LocateRegistry.createRegistry(3232);

BindExceptionこれは、レジストリがすでに実行されている場合にスローされます。したがって、オブジェクトを作成して使用することはできません

UnicastRemoteObject.unexportObject(registry, true);

ただし、使用しても

Registry registry = LocateRegistry.getRegistry(3232);

オブジェクトをアンエクスポートするためのパラメーターとして使用できないスタブを取得するだけです。

私にとって懸念の原因は、レジストリがまだ開始されていないことを確認できる場合にのみレジストリを開始したいからです。そして、私はそれを行う方法を見つけていません!

于 2009-10-17T02:57:48.427 に答える
-1

任意のプロセスからレジストリをシャットダウンする方法を見つけました (さらに言えば、レジ​​ストリにバインドされているバインドされたプロセスをシャットダウンします)。

リモートを拡張し、最終的に削除したいインターフェースは、次のインターフェースも拡張する必要があります。

public interface PIDSupplierInterface extends Remote {
  String getPID() throws RemoteException;
}

インターフェイスの一部としてこれを使用して作成するすべてのサーバー クラスは、getPID() を実装する必要があります。次に、プロセス ID を返す必要があります。Windows の場合は Google の「getpids」を使用するか、www.jroller.com/ santhosh/entry/get_current_java_process_idにアクセスしてください。私が理解しているように、Linuxの場合、PIDの取得はより簡単です。次に(Windowsで)行きたい

String PID = myServer.getPID();
String[] a_command = { "taskkill", "/pid", PID };
Runtime.getRuntime().exec(a_command, envp, dir);

レジストリ自体の PID を無効にするには、まず、レジストリを (プログラムで) 起動するときに、次のようにします。

PIDSupplierInterface stub = PIDSupplierInterface)UnicastRemoteObject.exportObject( 
 new PIDSupplierServer(), 0);
reg.bind( "regKiller",  stub );

ここで、PIDSupplierServer は、PIDSupplierInterface のみを実装するクラスです。

次に、任意のプロセスから RMI レジストリを強制終了する場合は、次のようにします。

PIDSupplierInterface regProcess = (PIDSupplierInterface)reg.lookup( "regKiller" );
String regPID = regProcess.getPID();
String[] a_command = { "taskkill", "/pid", regPID };
Runtime.getRuntime().exec(a_command, envp, dir);

システムからregが消えました。または、何らかの理由で質問がより複雑になっていますか? どんなコメントでも大歓迎です。

于 2011-02-10T19:13:38.993 に答える