2009-07-06 16 views
2

RMIを使用してWebAppAからWebAppB.WebAppBにStringオブジェクトを渡すのはRMIServerですが、WebAppAはRMIClientです。ContextListenerをWebAppBに追加しているため、tomcat.Andでコンテキストが初期化された時点でrmiサービスがすぐに開始されます。閉じるrmiレジストリ

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

しかし、たとえaforeseen文の実行後に、RMIはポートで着信要求を待機さ3232.Iがいることを見た:私は/クローズしようとしていますのTomcatのcontextDestroyed方法で次の文を使用して、RMIをシャットダウンコマンドプロンプトで "netsat -ano"を使用してください.RMIサービスを閉じるのに手伝ってください。

答えて

1

getRegistryはスタブのみを返します。したがって、unexportObjectでcreateRegistryによって返されたインスタンスを使用します。しかし、私の場合、これはどちらかの助けにはならない - レジストリは、もはや有効ではありませんが、ソケットはまだ開いていて、あなたがシャットダウンするようにレジストリをしようとしているとき

0

createRegistry :-(リスニングは動作しません

。レジストリがすでに実行されている場合
Registry registry = LocateRegistry.createRegistry(3232); 

これは、あなたが使用している場合でも、あなたはしかし

UnicastRemoteObject.unexportObject(registry, true); 

でそれを使用するオブジェクトを作成することはできません。BindExceptionをスローします

Registry registry = LocateRegistry.getRegistry(3232); 

スタブを取得するだけで、オブジェクトをアンエクスポートするパラメータとして使用することはできません。

私が懸念している理由は、まだ開始していないことを確認できれば、レジストリを起動したいからです。そして私はそれを行う方法を見つけていない!

+1

a * prior * 'createRegistry()'の* result *はアンエクスポートできます。実行されていることを確認するには、 'createRegistry()'を試してください: 'BindException'を取得した場合は、' getRegistry() 'を呼び出してください。もちろん、前者の場合はアンエクスポートしかできませんが、後者の場合は、他の人のレジストリであるため、アンエクスポートする必要があります。 – EJP

-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にアクセスしてください。私が理解しているように、PIDについてはもっと簡単です。そして、(Windowsの)あなたは、単にPIDSupplierServerがクラスである

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

を行って、(プログラム的に)レジストリを開始する際、まず、レジストリ自体のPIDを殺すために

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

に行きたいですこれはPIDSupplierInterfaceだけを実装します。その後

、あなただけのREGは、あなたのシステムから消えた

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

を行って任意のプロセスからのRMIレジストリを殺すしたいと思います。または、あなたの質問は何らかの理由でより複雑になっていますか?コメントは大歓迎です。

+0

'PIDSupplierInterface'を実装するためにRMIレジストリをどのように説得するのですか? 'PIDSupplierServer'を具体化していますか? – EJP

関連する問題